【问题标题】:How to remove duplicates from array using for loop如何使用for循环从数组中删除重复项
【发布时间】:2016-02-28 22:32:34
【问题描述】:

在这段代码中,我从一个数组中找到了重复项,我想删除它们。然后输出将是唯一生成的数字。我需要使用 math.random 和 modulo。有人有任何线索吗?我试图将它们存储在一个数组中,但是原始数组有 0,而 0 是我的随机数生成域的一部分(从 0 到 52)。

public class Decks {

 public static void main(String[] args) {

generate();

}

 public static void generate() {
int deckOfCard[] = new int[52];

for (int counts = 0; counts < 52; counts++) {

    deckOfCard[counts] = (int) (Math.random() * 51);

}

for (int i = 0; i < deckOfCard.length - 1; i++) {

    for (int j = i + 1; j < deckOfCard.length; j++) {

        if ((deckOfCard[i] == (deckOfCard[j])) && (i != j)) {

            System.out.println("DUPLICATE " + deckOfCard[i]);

        }
    }
}

for (int count = 0; count < deckOfCard.length; count++) {

    System.out.print("\t" + deckOfCard[count]);

}
}

【问题讨论】:

  • 您可以使用列表,使用负数来表示“已移除”的卡片,或者将值保存在新数组中。
  • 你的目标是:先生成52个数字,然后删除重复的?或者,正好生成 52 个unique 数字?
  • 我的目标是准确生成 52 个唯一数字,但我必须使用 math.random 和模数来创建它们并将它们存储在数组中。

标签: java arrays random


【解决方案1】:

为什么不尝试使用 HashSet 而不是数组?如您所知,集合仅存储唯一值,因此您不会有任何重复项。

【讨论】:

  • 好建议,但我必须遵循我愚蠢的课程指南来完成这项完全低效的作业。我必须使用数组并使用模数......
  • 在这种情况下,您可以创建一个大小为 52 的新数组 uniqueElem 并将所有索引初始化为 -1。现在对于deckOfCard[i] 中的每个元素,将元素存储在uniqueElem[deckOfCard[i]] = deckOfCard[i] 这样您的uniqueElem 将如下所示:{-1, -1, -1, ........ -1 - 1} 更新 uniqueElem 后,它将如下所示:{-1, -1, 2, -1, ...... -1, 51}
【解决方案2】:

必须像这样验证随机数生成期间生成的数字:

import java.util.Random;
public class Decks {
    public static void main(String[] args) {

        Random myRandom = new Random();

        int[] num = new int[53];

        boolean[] check = new boolean[53];
        int all = 0;
        int ranNum;

        while (all < 53) {
            ranNum = myRandom.nextInt(53);
            if (!check[ranNum]) {
                check[ranNum] = true;
                num[all] = ranNum;
                all++;
            }
        }
        for (int i = 0; i < 53; i++) {
            System.out.println(num[i]);
        }
    }
}

我建议不要包括数字0,因为它不存在于真正的一副牌中(ACE 是最低的数字值为 1)。我只是将其包含在此处,因为据我了解,0 包含在您想要的输出中。

【讨论】:

  • 谢谢,经过数小时的尝试,这仍然是最好的方法。
  • 很高兴它对您有所帮助。请选择这个作为答案
【解决方案3】:

考虑到时间复杂度,你可以先对它们进行排序,最好的情况是需要 nlogn 时间,然后使用 O(1) 找出重复的元素。

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 2013-04-19
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2014-06-28
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多