当前位置: 首页 > 知识库问答 >
问题:

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

壤驷志学
2023-03-14

问题

我正在构建一个应用程序,它可以从一系列条目中创建抽奖抽奖。开始抽奖时,用户可以输入一个整数,该整数表示抽奖将返回多少中奖者。应用程序使用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个答案

符学
2023-03-14

您可以通过循环直到 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())));
}
上官高翰
2023-03-14

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

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

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

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

 类似资料:
  • 问题内容: 我想下载文件以供进一步使用,这是找到的最好方法,但是当我看到Event 创建的日志时,URL已被queryString修改,例如: 数字也是随机的。 我不知道为什么会这样! 问题答案: 只需使用cache即可:true。jQuery会自动为您在URL末尾添加一个时间戳,以确保永远不会缓存ajax请求。 从jQuery文档 默认值: true,对于dataType’script’和’js

  • 我在mysql数据库中有一个数组数据,我想在使用Ajax得到结果后,用for循环逐个显示出来。过程是这样的。 这是将呈现每个项的段落 null 当我尝试使用for循环时,它会说语法错误,意外的for循环被取走,我该如何解决这个问题,例如,这里我使用sample for循环来使事情尽可能简单。

  • 所以我正在尝试创建这个循环,它可以从ArrayList中移除给定字符串中的特定字符。问题是,当一行中有两个相同的字符时,它会遗漏第二个字符,因为当第一个字符被移除时,第二个字符会在数组列表中向下推一个位置。这是我目前所掌握的。有人知道怎么解决这个吗?我仍然是java的初学者,所以任何帮助都将非常感谢。 从本例中打印出来的内容在:[u,B,u,o,p]之后,而我希望它在:[u,u,o,p]之后

  • 我刚学过JAVA,我对这段代码有一个问题: 现在我的包含!在这种情况下,我如何简单地避免重复?我以为HashSet不允许重复。

  • 我想把列表理解替换为for循环

  • 我已经了解了一些关于流的知识,并且知道它们可以用来代替循环。对于这个玩具示例,我使用一个图形数据库来存储一组字符串。数据库将它们存储为顶点。我想检索这些顶点,并将它们转换为字符串,而是使用流。每个顶点都有一组性质;我给它一个键,它返回一个值。如果一个顶点具有我正在寻找的属性,我将它添加到列表中。如果没有,我存储顶点ID。 我有一个for循环,但我不确定如何使用流来代替。代码如下: