【问题标题】:How do I create a mutable set from an already created array?如何从已创建的数组创建可变集?
【发布时间】:2021-04-20 19:20:41
【问题描述】:

我已经使用枚举器为花色和等级制作了这个卡片数组,但它是不可变的。我无法从Deck 中删除任何内容。我可以通过使用shuffle

void shuffle() {
    List<Card> shuffold = Arrays.asList(cards);
}

即使在使用Arrays.asList(cards) 时,我也无法使用remove 发牌。我不想每次发牌时都使用新牌组,只有在开始新手牌时。我应该将Deck 设为ArrayList 还是可以以某种方式将其转换为可变集,或者这是否可能?

public class Deck {
    public final Card[] cards;
    public Deck() {
        cards = new Card[52];
        int i = 0;
        for (Suit suit : Suit.values()) {
            for (Rank rank : Rank.values()) {
                cards[i++] = new Card(rank, suit);
            }
        }
    }
}

我已经可以使用shuffle,但该数组仍然是不可变的,因为我无法使用它来移除牌组中的第一张牌:

void deal() {
    Collection deal = new ArrayList(Arrays.asList(cards));
    deal.remove(0);
}

【问题讨论】:

标签: java arrays arraylist set


【解决方案1】:

您可能希望套牌是List,所以它有一个命令,但这很容易。随便写

List<Card> shuffled = new ArrayList<>(Arrays.asList(cards));

或者如果你真的想要一套

Set<Card> shuffled = new HashSet<>(Arrays.asList(cards));

【讨论】:

    【解决方案2】:

    Arrays.asList方法的主要特点是返回的列表是由指定的数组支持的,所以可以通过这个列表对数组使用Collections方法。由于数组是fixed-size的,这个列表也是fixed-size的,但是你可以shuffle它或者改变它以其他方式。

    要指定返回集合的类型,可以使用Java 8toCollection方法:

    String[] arr = {"A", "B", "C"};
    
    HashSet<String> set = Arrays.stream(arr)
            .collect(Collectors.toCollection(HashSet::new));
    
    set.add("D");
    
    System.out.println(set); // [A, B, C, D]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多