所以,我正在编写一个分析整个数组的程序,并显示重复的值以及唯一的值:
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等。或者任何其他工具,如迭代器
答案 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);