我是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;
}
}
答案 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或者是假的。我花了大约半年的时间来接受,所以我会节省你一些时间:)。