【发布时间】:2014-10-25 22:57:33
【问题描述】:
我有以下代码:
import java.util.Scanner;
public class ArrayDuplicates {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("How many numbers are you going to enter? ");
int num = scan.nextInt();
int[] arr = new int[num]; // initialize array with user inputted length
for (int i = 0; i < arr.length; i++) { // enter numbers into array
arr[i] = scan.nextInt();
}
int[] unique = new int[arr.length]; //initialize new array that will hold unique values
for (int i = 0; i < arr.length; i++) {
boolean b = true; //boolean that checks if an element is a duplicate
for (int j = i+1; j < arr.length; j++) { //check all elements above int i
if (arr[i] == arr[j]) {
b = false; // set b to false if there is an existing duplicate
}
}
if (b) {
unique[i] = arr[i]; // if no duplicates exist, then it is unique.
}
}
for (int i = 0; i < unique.length; i++) {
System.out.println(unique[i]);
}
}
}
这段代码的问题(除了对于大型数组来说非常慢,但这不是重点)是因为 unique 数组的未声明元素将被设置为 0,第一个中的重复元素数组在unique[] 中被设置为0(如果有任何意义的话)。我理解为什么会发生这种情况,但找不到解决此问题的有效方法。我尝试在唯一数组中将重复元素设置为Integer.MIN_VALUE,然后只打印不等于Integer.MIN_VALUE 的unique[] 的元素,但这似乎是解决问题的一个弱解决方案。我该如何解决这个问题?
编辑:如果我运行代码:
你要输入多少个数字? 4
1
2
2
0
输出:
1
0
2
0
由于数组的第二个元素是重复的,我没有将unique[1] 设置为任何值,使其默认为 0。如何避免打印该 0,因为它不是原始数组的一部分?
编辑 2: 是的,这是作业,但我不想使用集合、排序等的原因主要是我不熟悉它们。另外,由于我没有要求任何人为我编写整个程序,所以我认为寻求一点帮助是可以的。
【问题讨论】:
-
恐怕这对我来说没有任何意义,也许您可以改写您在问题中想说的内容?
-
您是否考虑过一开始就不向数组添加重复项?
-
您可以在创建
unique数组之前计算arr中的唯一元素 -
不使用 List 或 Set 解决方案会变得非常混乱。如果您不必使用列表或集合,我只是建议将重复值设置为 Integer.MIN_VALUE,就像您说的那样,或者创建一个布尔值的并行
-
Java 数组不是动态调整大小的,因此您无法在没有更多代码的情况下删除元素。此外,
Map或List不是Set或排序。
标签: java arrays duplicates duplicate-removal