为什么我的程序不计算某个列表中的每个重复数字,但适用于所有其他数字

时间:2017-02-03 16:55:17

标签: java

我正在尝试计算从大约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。 我已经尝试过其他手工制作的测试数据来证明这个程序按预期工作,但是这个特定的列表给了我一个问题。

3 个答案:

答案 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;
}