java - 如何检查数组列表是否包含不同的对象?

标签 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--;
  }
}

对于此代码,我尝试从另一个数组列表中随机挑选对象并将其添加到称为playerOne 的数组列表中。然而,数组列表playerOne不能再次保存相同的对象(每个对象的ID号不同,这就是方法.getID()返回的内容)。

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

任何帮助将不胜感激,谢谢!

如果需要请澄清:

如果我有一个名为holder的数组列表:

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

还有另一个名为 list2 的数组列表:

[]

我该如何做到这一点,以便我从holder中随机获取值,将其添加到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;      
  }
}

最佳答案

好吧,我不太清楚你到底想要什么。如果您正在寻找一种更有效的方法来测试玩家是否已经获得了奖品,那么 HashSet 是迄今为止您的最佳选择。您不再需要遍历 playerOne 中的所有 PrizeCard 对象,只需检查 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 语句只是评估 boolean 值,检查 boolean 值是否为 true 是多余的,因为它只是返回 true 或 false。我花了大约半年的时间才学会的东西,所以我会节省你一些时间:)

关于java - 如何检查数组列表是否包含不同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287183/

相关文章:

java - index.html 未显示(不支持请求方法 'GET')

javascript - 在 Javascript 中创建一个新对象

Java ArrayList 避免 IndexOutOfBoundsException

java - 使用 ArrayList 中的数据写入 JTextArea - Java Swing

java - 如何使用 Java 和 Spark SQL 打印数据集中的行内容?

java - 在匿名类的接口(interface)中只实现一种方法

java - 当屏幕锁定时,Selenium 执行停止

java - 使用文件中的字符串创建对象

javascript - 如何从功能标签的页面源代码中获取值?

java - 根据两个List的内容生成SortedMap