在for循环中添加到HashSet时,如何删除重复项,还要将其替换为另一个对象?

时间:2014-10-23 12:47:17

标签: java android arraylist hashset

问题

我正在构建一个可以从条目数组列表创建抽奖抽奖的应用程序。当开始绘制时,用户可以输入一个整数,该整数表示绘制将返回多少获胜者。该应用程序使用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;
&#13;
&#13;

2 个答案:

答案 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是否包含该索引。

  • 如果是,您知道该索引尚未使用,并将其从HashSet中删除。
  • 如果没有,则该索引已被使用,因此您再次绘制一个随机索引。

重复此过程,直到您有3个以前未使用的唯一索引。