从2D数组中删除重复

时间:2016-10-21 23:42:42

标签: java arrays duplicates

我这里有一个2D数组,我用随机数填充。我按如下方式填充我的数组:

for(int i = 0; i < 3; i++)
{
    for(int j = 0; j < 5; j++)
    {
        nums[i][j] = 1 + (int)(Math.random() * 60);
    }
}

我希望我的数组的数字介于0和60之间,因此:

* 60

我这样显示我的数字:

System.out.println("Nums are: " + nums[0][0]+ " " + nums[0][1]+ " " + nums[0][2]+ " " + nums[0][3]+ " " + nums[0][4]);

,输出看起来像这样

  

Nums是:43 6 32 6 12

我想用随机数填充我的数组,但我不希望它有匹配的数字,所以对于这个实例,数字6在数组中两次。我想从数组中删除重复项,或者根本不将它们放在数组中。

我想这样做的方法是在我的循环中有2个额外的for循环,其值大于0,这样我就可以有一个if语句来检查数组中的当前位置是否等于接下来,像这样:

for(int i = 0; i < 3; i++)
{
    for(int j = 0; j < 5; j++)
    {
        nums[i][j] = 1 + (int)(Math.random() * 60);
        for(int l = 1; l < 3; l++){
            for(int m = 1; m < 5; m++){
                if(nums[i][j] == nums[l][m]){
                    nums[i][j] = 1 + (int)(Math.random() * 60);
                }
            }
        }

正如你在这里看到的,我添加了l和m,它们都有一个数字1,这将使它们位于前一个位置之上。此外,我的if语句检查值是否相同,如果是,则再次对数字进行randoms。

这对我不起作用,请有人帮我一把,我做错了什么?

6 个答案:

答案 0 :(得分:0)

你可以这样做

git bisect
  1. 从1 - 60
  2. 填写一份清单
  3. 使用Collections.shuffle(List)来混合数字
  4. 从洗牌后获取数字
  5. 在这种情况下,我使用了Stack。

    看一下这篇文章。 Generating Unique Random Numbers in Java

答案 1 :(得分:0)

您可以简单地使用Set来跟踪您已经看过的数字,并定义一个新函数来封装您的“生成唯一随机数”逻辑。这将比每次生成值时检查2D数组的值更容易。对于初学者来说,嵌套循环令人困惑,但Set也更可取,因为它具有常量(即O(1))查找时间,因此它可以快速找到值。

private final Set<Integer> usedValues = new HashSet<>();

private void populateArray(int[][] nums) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            nums[i][j] = getUniqueRandomNum();
        }
    }
}

private int getUniqueRandomNum() {
    int val;

    do {
        val = 1 + (int) (Math.random() * 60);
    } while (usedValues.contains(val));

    usedValues.add(val);

    return val;
}

答案 2 :(得分:0)

将您的数字存储在数组中并删除已使用的数字

    LinkedList<Integer> integers = new LinkedList<Integer>();
    for (int i = 0; i < 60; i++) {
        integers.add(i);
    }
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 5; j++)
        {
            int random = 1 + (int)(Math.random() * integers.size());
            nums[i][j] = integers.remove(random);
        }
    } 

答案 3 :(得分:0)

试试这个

public static int[][] random(int i, int j, int max) { // 3, 5, 60
    Supplier<Integer> function = new Supplier<Integer>() {
        final Set<Integer> ints = new HashSet<>();
        final Random r = new Random();
        @Override
        public Integer get() {
            int n;
            while (ints.contains(n = r.nextInt(max)))
                ;
            ints.add(n);
            return n;
        }
    };
    int[][] matrix = new int[i][j];
    IntStream.range(0, i * j).forEach(in -> matrix[in % i][in % j] = function.get());
    return matrix;
}

或仅使用ThreadLocalRandom

public static int[][] random(int i, int j, int max) {
    List<Integer> random = ThreadLocalRandom.current().ints(0, max).distinct().limit(i * j).collect(ArrayList::new, List::add, List::addAll);
    int[][] matrix = new int[i][j];
    IntStream.range(0, i * j).forEach(in -> matrix[in % i][in % j] = random.get(in));
    return matrix;
}

答案 4 :(得分:-1)

你不需要删除&#34;它们之前的位置&#34;,你必须创建另一个循环来检查新的Math.ramdom()是否等于数组的元素。

我会告诉你代码:

for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 5; j++)
            {
                int numRam = (int)(Math.random() * 60);
                bool check = true;
                for(int l = 1; l < (Size of the array); l++){
                    if(nums[i][l] == numRam){
                         check = false;
                         break;
                    }
                }

                if(!check){         //If the number exist you do j - 1
                    j--;            //so you would try with a different ramdom number
                }else{
                    nums[i][j] = numRam;
                }
             }
        }

答案 5 :(得分:-1)

你也可以试试这个:

int end = arr.length;
Set<Integer> set = new HashSet<Integer>();

for(int i = 0; i < end; i++){
    set.add(arr[i]);
}

我找到了一个修复程序,我不确定它是否适用于您的代码,但它可以尝试。

  

Class HashSet

     

boolean add(E e)

     

如果尚未将指定的元素添加到此集合中   本。