【问题标题】:Java - Finding duplicate entries in multiple arraysJava - 在多个数组中查找重复条目
【发布时间】:2012-05-04 23:32:51
【问题描述】:

我希望在一堆 Point 数组中找到唯一点(即删除所有重复项并查看剩下的内容)。

这是我尝试过的代码:

int numCount = 0;
    for (int x = 0; x < ALLARRAYS.length; x++) {
        for (final Point test : ALLARRAYS[x]) {
            NUMBER: for (final Point[] numbers : ALLARRAYS) {
                if (numbers == ALLARRAYS[x]) {
                    continue;
                }
                for (int i = 0; i < numbers.length; i++) {
                    if (test.equals(numbers[i])) {
                        break NUMBER;
                    } else {
                        if (i == numbers.length - 1) {
                            numCount++;
                        }
                    }
                }
            }
            if (numCount == 10) {
                System.out.println(x + "\tPoint: " + test.x + ", " + test.y + " is unique.");
            }
            numCount = 0;
        }
        System.out.println();
    }

基本上,我要检查 11 个数组,因此 numCount 会检查 10 个要确认的数组。我的方法是循环遍历每个数组,然后循环遍历该数组中的所有点,然后循环遍历每个其他数组中的每个点。如果它看到重复,它会完全跳过整个数字。

我的问题:我得到了错误的读数。我不确定发生了什么,但程序会吐出其他数组中已经存在的点。

我的目标:每个数组作为一个整体工作。如果一个元素不满足,则跳过整个数组。我的最终结果应该是 11 个较小的数组,它们都是唯一的,以便方法可以检查每个集合的元素并确定它们都是唯一的。

注意:这些数组现在都是独一无二的,它们非常大。我正在寻找一种方法来通过创建这个小程序来消除重复项来截断它。

我的问题:有人可以帮我吗?

【问题讨论】:

  • 您的问题是什么?这段代码是否按您的预期工作,还是有什么问题?
  • 您能否提供一些示例输入、实际输出和预期输出,以便我们帮助找出发生这种情况的原因?
  • test == numbers[i]。 Point 是一个类,如果 testnumbers[i] 具有相同的引用,则使用 == 运算符比较它只会返回 true。尝试改用test.equals(numbers[i])
  • 您还需要考虑将Point 与自身进行比较的情况。
  • 如果您的数组“大得离谱”,请考虑对它们进行排序。然后,一旦遇到在您正在测试的点之后出现的点,您就可以跳到下一个数组。

标签: java arrays


【解决方案1】:

将所有数组条目放在一个集合中,它将跳过重复项。

请确保正确覆盖 Point 类上的 equals 方法,因为 Set 接口的实现将使用它。

HTH

【讨论】:

  • 如果他想将数组合并到一个新数组中,这可以工作
  • 我不是在找这个。请使用我上面的例子。
  • 我认为更好的方法是将条目放入一个映射中,从 entryentry 在数组中出现的次数。关键可能是一个Integer,或者,如果您担心对象分配,一个可变的Integer-type 类。创建 Map 后,您可以遍历 Map 条目并获取计数为 1 的条目。
【解决方案2】:

您的代码似乎检查了 所有 数组中的 Point,包括您要查找的 Point 出现在其中的数组。因此,您的代码将始终找到它正在寻找的 Point,而您最终将得不到任何结果。

您可能需要这样做:

        NUMBER: for (final Point[] numbers : ALLARRAYS) {
            if (numbers == array) {
                continue; // skip the array that contains 'test'
            }
            ...
        }

这样,您将跳过包含test 元素的数组。

【讨论】:

  • @JavaCoder-1337 Greg 的编辑应该涵盖它,前提是您在单个数组中没有任何要忽略的重复点。
  • 您的建议有所帮助,但仍然给了我一些重复。我已经编辑了我的原始帖子,包括我当前的代码。
  • 防弹答案是在内部循环中测试(numbers == array &amp;&amp; test == numbers[i])。但是为什么要使用两种不同风格的for 循环呢?不需要柜台i。回复:“太咄咄逼人”,请保持礼貌,如果您问的是入门级问题,您可能需要重新考虑“JavaCoder”和“1337”作为句柄。
  • @JavaCoder-1337:好的,所以您已经 (a) 移动了球门柱,使现有答案无效,并且 (b) 继续未能提供证明您的问题的示例数据。在这一点上,我们越来越难以复制您的问题,因为我们没有您所做的所有信息。
【解决方案3】:

数组不太适合您的工作。它们不仅没有像 intersection 或 removeAll 这样的方法,而且很难改变,尤其是如果你想减小它们的大小。

为了避免这种麻烦,我通过将 x 和 y 设置为 -1 将 Point 标记为 removed,一个坐标当然就足够了,但是出于对称的原因......

import java.util.*;
import java.awt.Point;

public class RandPoints
{
    Random r = new Random ();
    Point [][] arr;

    public void removeDuplicatesFrom2 (Point [] pa, Point [] pb) {
        for (Point p : pb) {
            if (p.x != - 1 && Arrays.asList (pa).contains (p)) {
                // System.out.println ("dup: " + p.x + " " + p.y);
                p.x = -1;
                p.y = -1;
            }
        }
    }

    // create a random point in range (0..19)(0..19)
    public Point randpoint () {
        return new Point (r.nextInt (20), r.nextInt (20));
    }

    // create 10 (default) arrays of size 100 (default)
    public void init (int arrsize, int arrcount) 
    {
        arr = new Point [arrcount][];
        for (int c = 0; c < arrcount; ++c)
        {
            Point [] points = new Point [arrsize];
            for (int s = 0; s < arrsize; ++s)
            {
                Point p = randpoint ();
                points[s] = p; 
            }
            arr[c] = points;
        }
    }

    public void unify () 
    {
        for (Point[] pac0 : arr) {
            for (Point[] pac1 : arr) 
            {
                if (pac0 != pac1)
                removeDuplicatesFrom2 (pac0, pac1);     
            }   
        }
    }

    /**
        fill arrays with duplicates by random, 
        show, delete and show again.
    */
    public RandPoints (int arrsize, int arrcount)
    {
        init (arrsize, arrcount);
        show ();
        unify (); 
        System.out.println ();
        show ();
    }

    public static void main (String args[])
    {
        int arrsize = 100;
        int arrcount = 10;
        if (args.length == 2)
        {
            arrsize = Integer.parseInt (args[0]);
            arrcount = Integer.parseInt (args[1]);
        }
        new RandPoints (arrsize, arrcount);
    }

    // visible feedback is always welcome while debugging/testing
    public void show ()
    {
        for (Point[] pa: arr) {
            for (Point point: pa)
                if (point.x != -1 && point.y != -1)
                    System.out.print (point.x + ", " + point.y + "\t");
            System.out.println ();
        }
    }
}

我稍微修改了代码,以使值 (20) 的最大范围也可配置。

开始

java RandPoints 16 10 10
3, 0    9, 0    6, 9    2, 3    6, 9    7, 4    9, 9    2, 5    8, 7    3, 3    9, 5    3, 7    0, 5    7, 6    0, 4    8, 1    
6, 1    2, 7    2, 5    6, 7    0, 7    5, 8    4, 2    1, 9    8, 4    5, 7    0, 2    3, 1    1, 9    2, 1    8, 0    1, 7    
5, 4    9, 7    9, 3    7, 3    1, 2    9, 6    0, 4    6, 0    3, 0    7, 7    1, 3    1, 1    5, 3    3, 8    1, 0    4, 9    
4, 7    8, 9    4, 0    0, 2    8, 7    5, 8    7, 0    1, 4    4, 9    8, 2    6, 9    9, 6    2, 1    1, 9    0, 8    6, 5    
6, 8    9, 6    1, 0    6, 9    4, 0    5, 1    2, 9    7, 3    5, 1    2, 5    6, 9    0, 9    7, 4    8, 1    5, 5    3, 4    
5, 9    0, 4    5, 4    2, 2    2, 6    7, 1    2, 0    6, 1    0, 4    9, 8    5, 7    5, 5    4, 6    9, 0    2, 8    8, 5    
8, 2    4, 2    0, 8    1, 1    0, 3    3, 4    1, 8    3, 1    6, 6    4, 1    3, 6    6, 0    1, 7    4, 8    1, 6    1, 1    
6, 2    1, 3    2, 4    0, 8    9, 0    3, 0    1, 1    3, 7    6, 2    2, 4    0, 9    3, 6    7, 2    1, 2    5, 0    8, 2    
2, 3    5, 6    7, 9    3, 0    9, 3    2, 6    4, 8    8, 7    9, 4    5, 3    0, 3    3, 0    5, 5    1, 4    6, 4    5, 2    
3, 2    4, 9    6, 9    4, 7    7, 1    0, 4    5, 8    7, 2    5, 2    5, 5    2, 1    9, 8    4, 9    6, 6    7, 7    0, 3    

3, 0    9, 0    6, 9    2, 3    6, 9    7, 4    9, 9    2, 5    8, 7    3, 3    9, 5    3, 7    0, 5    7, 6    0, 4    8, 1    
6, 1    2, 7    6, 7    0, 7    5, 8    4, 2    1, 9    8, 4    5, 7    0, 2    3, 1    1, 9    2, 1    8, 0    1, 7    
5, 4    9, 7    9, 3    7, 3    1, 2    9, 6    6, 0    7, 7    1, 3    1, 1    5, 3    3, 8    1, 0    4, 9    
4, 7    8, 9    4, 0    7, 0    1, 4    8, 2    0, 8    6, 5    
6, 8    5, 1    2, 9    5, 1    0, 9    5, 5    3, 4    
5, 9    2, 2    2, 6    7, 1    2, 0    9, 8    4, 6    2, 8    8, 5    
0, 3    1, 8    6, 6    4, 1    3, 6    4, 8    1, 6    
6, 2    2, 4    6, 2    2, 4    7, 2    5, 0    
5, 6    7, 9    9, 4    6, 4    5, 2    
3, 2    

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2016-01-13
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多