我正在尝试计算从大约20_000个值的文件创建的ArrayList中的重复整数的数量,每个值由换行符分隔。我当前的代码适用于每个列表,除了一个我无法轻易改变的特定列表,我一直坚持。
//Arrays Class, use numerical sorting method
//Read in each number and look for duplicates, return the number of duplicates.
System.out.println("Creating List.....");
File numbers = new File("src/testlist");
List<Integer> numberlist = new ArrayList<Integer>();
try {
Scanner input = new Scanner(numbers);
while(input.hasNextInt()){
//int number = input.nextInt();
numberlist.add(input.nextInt());
//System.out.println(number);
}
System.out.println("List Created");
input.close();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(NoSuchElementException r){
r.printStackTrace();
System.out.println("oops");
}
System.out.println("Sorting Numerically.....");
Collections.sort(numberlist);
System.out.println(numberlist);
System.out.println("Counting Duplicate Numbers.....");
int duplicates = 0;
for(int i = 0; i < numberlist.size()-1; i++){
if(numberlist.get(i) == numberlist.get(i+1)){
duplicates++;
numberlist.remove(i);
}
}
System.out.println("Duplicates: " + duplicates);
使用的文件是here。 我已经尝试过其他手工制作的测试数据来证明这个程序按预期工作,但是这个特定的列表给了我一个问题。
答案 0 :(得分:0)
当你这样做时
numberList.remove(i)
for循环跳过一个元素。实际上,您删除了元素编号i
,下一个评估应该从数字i
开始,而不是i+1
。
如果在迭代时更改列表元素,索引会变得很奇怪,而且做这些事情从来都不是一个好习惯。
执行此操作最简洁的方法是保留源列表而不删除任何内容,并将元素复制到新列表中,跳过重复项。
通过这种方式,您将获得一个新列表,其中包含结果(没有重复的列表),并且可以从此列表的大小轻松计算出它们的数量。
答案 1 :(得分:0)
我在评论中提到的,删除
Set<Integer> set = new HashSet<Integer>(numberList);
System.out.println( numberList.size() - set.size() );
并且您的循环将按预期工作
根据需要计算重复项的最简单方法是将列表转换为Set并比较两者的大小。在Set中,所有值都是唯一的。
{{1}}
答案 2 :(得分:0)
public static void countDuplicates() {
Integer count = 0;
List<Integer> list = getNumbersFromFile();
Set<Integer> unique = new HashSet<Integer>(list);
for (Integer key : unique) {
if (Collections.frequency(list, key) > 1) {
count++;
}
}
System.out.println("Count Of Duplicates " + count);
}
public static List<Integer> getNumbersFromFile() {
File numbers = new File("src/numbers.txt");
List<Integer> numberlist = new ArrayList<Integer>();
try {
Scanner input = new Scanner(numbers);
while (input.hasNextInt()) {
// int number = input.nextInt();
numberlist.add(input.nextInt());
// System.out.println(number);
}
System.out.println("List Created");
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NoSuchElementException r) {
r.printStackTrace();
System.out.println("oops");
}
return numberlist;
}