如何检查arraylist是否包含不同的对象?

时间:2018-03-14 20:34:49

标签: java object arraylist

我是Java的初学者:

for (int i = 0; i <= 4; i++) {
  taken = false;
  spun = wheel.spinWheel();
  for (PrizeCard a : playerOne) {
    if (spun.getID() == a.getID()) {
      taken = true;
    }
  }

  if (!taken) {
    playerOne.add(spun);
  } else {
    i--;
  }
}

对于这段代码,我试图从另一个arraylist中随机挑出对象并将其添加到名为playerOne的arraylist中。然而,arraylist playerOne不能再次保持相同的对象(每个对象的ID号不同,这就是方法.getID()返回的内容)。

所以我认为应该工作,spinWheel()是随机返回一个对象的方法,然后它遍历每个对象并用前一个对象检查它的ID,如果它是相同的,它将不会添加对象和再旋转一次,因为我从变量i中减去了一个。

非常感谢任何帮助,谢谢!

如果需要澄清:

如果我有一个名为holder的arraylist:

[“你好”,“恐龙”,“鸡”]

另一个名为list2的arraylist:

[]

我如何制作它以便我从持有者中随机获取值,将其添加到list2,但请确保我只添加它(如果尚未添加)。

例如,如果我添加“Chicken”,它将永远不会再将“Chicken”添加到列表2中。

以下是其他方法:

import java.util.*;
 import java.lang.*;

      public class GameWheel {
       private ArrayList<PrizeCard> prizeCards;
        private int currentPos;

    public GameWheel() {
   prizeCards = new ArrayList<PrizeCard>();
  currentPos = 0;
  prizeCards = initGameWheel();
   prizeCards = scramble();
 }

 public ArrayList<PrizeCard> initGameWheel() {
  ArrayList<PrizeCard> init = new ArrayList<PrizeCard>();
  for (int i=1; i <= 40; i++) {
    if (i%2 == 1)
      init.add(new PrizeCard(i, "red", i*10));
    else if (i%10 == 0)
      init.add(new PrizeCard(i, "black", i*200));
    else
        init.add(new PrizeCard(i, "blue", i*100));
     }
   return init;
  }

  public ArrayList<PrizeCard> getPrizeCards() {
    return prizeCards;
    }

     public PrizeCard spinWheel() {
 int power = (int)(Math.random()*100 + 1);
 int newPos = (currentPos + power) % prizeCards.size();
 currentPos = newPos;
 return prizeCards.get(currentPos);
 }


   }


    public class PrizeCard {
     private int id;
      private String color;
       private int prizeAmount;

     public PrizeCard() {
         id = 0;
         color = "red";
          prizeAmount = 0;
      }

 public PrizeCard(int nID, String nColor, int nPrizeAmount) {
       id = nID;
          color = nColor;
         prizeAmount = nPrizeAmount;
     }

  public int getID() {
    return id;
  }

  public int getPrizeAmount() {
    return prizeAmount;
  }

  public String toString() {
    return "ID: " + id +
      ", Color: " + color +
      ", Prize Amount: $" + prizeAmount;      
  }
}

2 个答案:

答案 0 :(得分:1)

使用Set,它只允许使用唯一值。

不要忘记覆盖equals()hashCode()

您可以通过调用Set来检查对象是否在someSet.contains(element)

答案 1 :(得分:1)

好的,所以我不太确定你要求的是什么。如果您正在寻找一种更有效的测试方式,以确定玩家是否已获得奖品,那么HashSet是您最好的选择。您不再需要遍历PrizeCard中的所有playerOne个对象,您只需检查spun对象是否在集合中。

HashSet<PrizeCard> prizes = new HashSet<PrizeCard>();
for (int i=0; i<=4; i++) {
    do{
        spun=wheel.spinWheel();
    }while(prizes.contains(spun));
    prizes.add(spun);
}

然而,这仍然引出了spinWheel()如何运作的问题。因为如果它在随机索引中访问ArrayList效率非常差,因为你不得不一遍又一遍地循环,直到你发现你没有访问过的索引。只有五个插槽并不太可怕,但如果你有五百个呢?如果您有包含重复项的奖品列表怎么办?发生无限循环的风险!我会在方法创建上“洗牌”,将它们放在Stack中,然后每次弹出堆栈。这样做可以摆脱嵌套的do{ ... } while(...);

public class Wheel{
    Stack<PrizeCard> prizes;
    public Wheel(){
        prizes = new Stack<PrizeCard>();
        //populate prizes here
    }

    public PrizeCard spinWheel(){
        return prizes.isEmpty() ? null : prizes.pop();
    }
}

当然,Stack可能不是您想要的,特别是如果您计划重复使用它。在那种情况下,我会将它们存储在PrizeCard数组中。您还可以执行随机算法并将其放在reset()方法中。

PrizeCard[] prizeCards; //populated in constructor

public void reset(){
    for(int i = 0; i < prizeCards.length; i++){
        swap(i, rand.nextInt(prizeCards.length)); //There are better shuffle algorithms for the record
    }
}

private void swap(int i, int j){
    PrizeCard temp = prizeCards[i];
    PrizeCard[i] = PrizeCard[j];
    PrizeCard[j] = temp;
}

只是不要打电话给reset(),除非您可以使用可能存在重复的重复项(您可以重新实施do{ ... }while( ... );来修复)。

最后,有趣的事实是,您可以使用if(notTaken==true)并切断==true位,if语句只是评估一个布尔值,检查布尔值是否为真是多余的,因为它只返回true或者是假的。我花了大约半年的时间来接受,所以我会节省你一些时间:)。