问题
我正在构建一个可以从条目数组列表创建抽奖抽奖的应用程序。当开始绘制时,用户可以输入一个整数,该整数表示绘制将返回多少获胜者。该应用程序使用randomGenerator从条目arrayList中选择一个随机索引。这个randomGenerator在for循环中,它检查迭代次数并将其与numberOfWinners整数进行比较。
假设用户已插入" 3"作为numberOfWinners的整数。该应用程序将返回三个随机条目,但有时会有重复。
很自然地,我研究了如何避免重复。我遇到了HashSet。如果将两个重复条目添加到HashSet,则只添加一个唯一条目。然后我将此HashSet转换为新的ArrayList,并将其作为ListView显示在我的Android视图中。
但是,HashSet还没有解决问题。如果用户输入输入" 3"对于numberOfWinners,并且有重复,最终结果将只有2个条目。
我该如何解决这个问题?
以下是我的代码的一部分:
Set <Entry>drawSet = new HashSet<Entry>();
//Picks random int from size of entry arrayList
Intent viewDrawIntent = getIntent();
int currentRaffleID = viewDrawIntent.getIntExtra("raffleIndexInList", 0);
int newNoOfWinners = viewDrawIntent.getIntExtra("extraNoOfWinners", 0);
Raffle currentRaffle = Raffle.raffleArrayList.get(currentRaffleID);
for (int i = 1; i < (currentRaffle.getEntryArrayList().size()); i++) {
if(i != newNoOfWinners){
int randomInt = randomGenerator.nextInt(currentRaffle.getEntryArrayList().size());
Entry randomEntry = (currentRaffle.getEntryArrayList()).get(randomInt);
//Adds new Entry to entryDraw Array
drawSet.add(randomEntry);
}
else{
}
}
ArrayList<Entry> entryDraw = new ArrayList<Entry>(drawSet);
&#13;
答案 0 :(得分:0)
您可以通过循环来解决此问题,直到该集合包含所需的获胜者数量。
工作示例:
List<Integer> tickets = Arrays.asList(1, 2, 3, 4, 5);
Set<Integer> winners = new HashSet<Integer>();
Random random = new Random();
while (winners.size() < 3) {
winners.add(tickets.get(random.nextInt(tickets.size())));
}
答案 1 :(得分:0)
您可以使用HashSet通知您是否已使用ArrayList的索引。
如果要从列表中选择3个唯一索引,则初始化HashSet以包含ArrayList的所有索引。然后,每次绘制随机索引时,检查HashSet是否包含该索引。
重复此过程,直到您有3个以前未使用的唯一索引。