重复的数组元素和唯一元素

时间:2014-11-17 09:01:58

标签: java arrays

所以,我正在编写一个分析整个数组的程序,并显示重复的值以及唯一的值:

int dupe = 0;
int[] range = {1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6};
for (int i = 0; i < range.length; i++) {
        for (int j = i + 1; j < range.length; j++) {
            if (range[i] == range[j]) {
                dup = range[j];
                System.out.println(dup);
            }
        }
}

上面的代码正确输出重复的值但是当值重复三次或更多次时,它会多次输出该值而不是一次

1
2
2
2
3
3
3
6

我该如何解决这个问题?

对于程序的唯一值部分,我不知道从哪里开始。

谢谢!

编辑:我可以使用的唯一Arrays类方法是:binarySearch,copyOf,equals,fill,sort和toString

我需要编写自己的实现 - 不要使用Set,HashSet等。或者任何其他工具,如迭代器

6 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

int[] range = {1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6};
boolean duplicate = false;
for (int i = 0; i < range.length; i++) {
     duplicate = false;
     for (int j = i + 1; j < range.length; j++) {
         if (range[i] == range[j]) {
             duplicate = true
         }
     }
     if(!duplicate){
         System.out.println(range[i]);
     }
}

答案 1 :(得分:1)

您可以将值添加到Set。它将为你完成所有工作。

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

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

如果您不能使用其他数据结构,这是一个很好的解决方案:https://stackoverflow.com/a/17974322/2290763

答案 2 :(得分:1)

其他解决方案是正确的但他们会给O(n^2),你不需要使用两个for循环。这将为您提供O(n)

    int[] range = {1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6};
    int temp = range[0];
    if(temp != range[range.length-1]){
     for (int i = 1; i < range.length; i++) {
            if(temp != range[i]){
               System.out.println(temp);
               temp = range[i];
           }
     }
    }
    else
       System.out.println(temp);

答案 3 :(得分:1)

数组中的每个值都是唯一的或多次出现。没有其他案例。 因此,您的任务可以被删除,只需删除重复项并打印其他所有内容。 如果对数组进行了排序,那么在迭代识别重复项时,只需检查最后一个值就足够了。

我会这样做:

int[] range = {1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6};
Arrays.sort(range);

for (int i = 0; i < range.length; i++) {
    if (i == 0) {
        System.out.println(range[0]);
    } else if (range[i - 1] != range[i]) {
        System.out.println(range[i]);
    }
}

答案 4 :(得分:1)

在对数组进行排序后尝试:

int[] range = { 1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6 };
    Arrays.sort(range);
    System.out.println(range.length > 0 ? range[0]
            : "No sufficient elements");
    for (int i = 1; i < range.length; i++) {
        if (range[i - 1] != range[i]) {
            System.out.println(range[i]);
        }
    }

答案 5 :(得分:0)

编辑。试试这个:

    int[] range = { 1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6};
    for (int i = 0; i < range.length; i++) {
        int j = i + 1;
        for (; j < range.length && range[i] == range[j]; j++) {
            // do nothing
        }

        if (j >= i + 2) {
            System.out.println(range[i]);
            i = j;
        }

    }
}

您的解决方案中的问题在于此部分      for (int i = 0; i < range.length; i++) { for (int j = i + 1; j < range.length; j++) {

对于您正在检查的数组中的每个元素,是否存在具有相同值的元素,并且index大于元素的索引。 例如,对于索引为2(值为2)的元素,它会检查所有(索引:3,4,5,6,...)。并且有两个匹配(索引为3和4的元素)。

编辑:(在@FabianBarney评论之后)

解决方案:

    String uni = "Uniques: ";
    String dup = "Duplicates: ";

    int[] range = { 1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6};

    for (int i = 0; i < range.length; i++) {
        if (i + 1 < range.length && range[i + 1] == range[i]) {
            dup += range[i] + " ";

            int j = i + 1;
            while (j < range.length && range[i] == range[j]) {
                j++;
            }
            i = j - 1;
        } else {
            uni += range[i] + " ";
        }
    }

    System.out.println(uni);
    System.out.println(dup);