提问者:小点点

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


问题

我正在构建一个应用程序,它可以从一系列条目中创建抽奖抽奖。开始抽奖时,用户可以输入一个整数,该整数表示抽奖将返回多少中奖者。应用程序使用randomGenerator从条目arrayList中选择一个随机索引。这个randomGenerator位于for循环中,该循环检查它被迭代了多少次,并将其与numberOfWinners整数进行比较。

假设用户插入了“3”作为他们的数字的整数。该应用程序将返回三个随机条目,但有时会有重复项。

所以我很自然地研究了如何避免重复。我遇到了HashSet。如果将两个重复的条目添加到HashSet,则只会添加一个唯一的条目。然后我将这个HashSet转换为一个新的ArrayList,并将其显示在我的Android视图中。

然而,HashSet并没有解决这个问题。如果用户为numberOfWinners输入“3 ”,并且有一个重复项,则最终结果将只有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);

共2个答案

匿名用户

您可以使用HashSet来告诉您ArrayList的索引是否已被使用。

如果要从列表中选择3个唯一索引,请初始化一个HashSet以包含ArrayList的所有索引。然后,每次绘制随机索引时,您都会检查HashSet是否包含该索引。

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

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

匿名用户

您可以通过循环直到 Set 包含所需数量的获胜者来解决此问题。

工作示例:

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())));
}