Java 统计列表中对象的出现次数

Java 统计列表中对象的出现次数,java,Java,我试图计算列表中某个对象的出现次数,但看起来好像不起作用 这是我的班级卡: public class Card { private int value; private String type; private String color; } 在这里,我试图设置一组104张卡,每张卡包含2次出现,但我的条件似乎不正确: public static List<Card> InitializeDeck(){ for(int i=0;i<1

我试图计算列表中某个对象的出现次数,但看起来好像不起作用

这是我的班级卡:

public class Card {
    private int value;
    private String type;
    private String color; 
}
在这里,我试图设置一组104张卡,每张卡包含2次出现,但我的条件似乎不正确:

public static List<Card> InitializeDeck(){
        for(int i=0;i<104;i++){
            boolean isOk = true;
            while (isOk){
                int col = (int) (Math.floor(Math.random() * 2) + 1);
                if (col == 1) {
                    color = "Black";
                } else {
                    color = "Red";
                }

                value = (int) (Math.floor(Math.random() * 14));
                while (value == 0) {
                    value = (int) (Math.floor(Math.random() * 14));
                }

                int ty = (int) (Math.floor(Math.random() * 4));
                switch (ty) {
                    case 0:
                        type = "Spade";
                        break;
                    case 1:
                        type = "Heart";
                        break;
                    case 2:
                        type = "Diamond";
                        break;
                    case 3:
                        type = "Club";
                        break;
                }
                Card card = new Card(value, type, color);
                if(deck.isEmpty() || deck.stream().filter(line -> card.equals(line)).count()<=1){
                    deck.add(card);
                    isOk=false;
                }
            }

        }

        return deck;
    }
publicstaticlist InitializeDeck(){

对于(int i=0;i card.equals(line)).count(),我将对您的问题的评论进行一点总结,并给出一个简短的示例,说明如何在不使用随机数和使用枚举的情况下构建数据组

首先,我们定义枚举:

enum Color {
  RED,
  BLACK;
}

enum CardType {
  SPADE, //as per Yassin's comments you'll probably want to define the type's color later on
  HEART, //you'd then use HEART(Color.RED) etc. - and provide the correct constructor
  DIAMOND,
  CLUB;
}
类:

class Card {
  private final int value;
  private final CardType type;
  private final Color color;

  //I'll omit the constructor, getters, equals and hashcode for simplicity, they should be straight forward
}
建造甲板:

List<Card> deck = new ArrayList<>(208); //we're telling the list that we expect 208 elements

//build two cards for each combination and add them to the deck
for( int value = 1; value  <= 14; value++ ) {
  for( CardType type : CardType.values() ) {
    for( Color color : Color.values() ) {
      deck.add( new Card( value, type, color ) );
      deck.add( new Card( value, type, color ) );
    }
  }
}

//shuffle the deck
Collections.shuffle( deck );
List deck=new ArrayList(208);//我们告诉列表我们需要208个元素
//为每个组合构建两张牌,并将它们添加到牌组中

对于(int value=1;value我们需要更多的代码,你需要在构建牌组的地方添加代码,看看构建牌组时是否创建了一个52加52张不同牌的牌组。此外,你需要添加类
Card
equals
方法的代码,当然,我要添加完整的代码,然后你是否覆盖
eqALUS()
在您的
类中?@OthK好吧,2种颜色、4种类型和13种值将提供104种不同的组合。您确定要这样做,并且仍然添加两次卡吗?当您使用不可变
实例时,无需执行
新卡(值、类型、颜色)
两次,您可以将同一个实例添加到列表中两次。您可以更进一步,当您始终只为每种
卡创建一个实例时,它的工作原理非常类似于
枚举
,因此您不需要覆盖
等于
哈希代码
@Holger您是对的,我们可以这样做。我想我就不这么说了,因为这对OP来说可能有点太复杂了(他显然在
equals
hashCode
方面有问题)。在某个时候,他可能想向单个卡实例添加额外的数据(例如,一些唯一的id来检查它们是否“重复”/同时被两个玩家持有:),因此有两个实例更接近真实世界。@Thomas非常感谢!!它解决了我的问题,现在我来看看如何正确地添加equals和hashcode