Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的程序不计算某个列表中的每个重复数字,而是计算所有其他数字_Java - Fatal编程技术网

Java 为什么我的程序不计算某个列表中的每个重复数字,而是计算所有其他数字

Java 为什么我的程序不计算某个列表中的每个重复数字,而是计算所有其他数字,java,Java,我试图计算从大约20000个值的文件创建的ArrayList中重复整数的数量,每个值由一个换行符分隔。我当前的代码适用于每一个列表,除了一个我无法轻易更改并且被卡住的特定列表 //Arrays Class, use numerical sorting method //Read in each number and look for duplicates, return the number of duplicates. System.out.println("Creating

我试图计算从大约20000个值的文件创建的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);
//数组类,使用数字排序方法
//读入每个数字并查找重复项,返回重复项的数量。
System.out.println(“创建列表…”);
文件编号=新文件(“src/testlist”);
List numberlist=new ArrayList();
试一试{
扫描仪输入=新扫描仪(编号);
while(input.hasNextInt()){
//int number=input.nextInt();
add(input.nextInt());
//系统输出打印项次(编号);
}
System.out.println(“创建的列表”);
input.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(无接触元素异常r){
r、 printStackTrace();
System.out.println(“oops”);
}
System.out.println(“数字排序…”);
Collections.sort(numberlist);
System.out.println(numberlist);
System.out.println(“计数重复数…”);
重复整数=0;
对于(int i=0;i
我使用的文件是。 我尝试了其他手工制作的测试数据来证明这个程序按预期工作,但这个具体的列表给了我一个问题。

当你这样做的时候

numberList.remove(i)
for循环跳过一个元素。实际上,您删除了元素number
i
,下一次求值应该从number
i
开始,而不是从
i+1
开始

如果在迭代时更改列表元素,索引会变得很奇怪,而这样做从来都不是一个好的做法

执行此操作最干净的方法是保留源列表而不删除任何内容,并将元素复制到新列表中,跳过重复项


通过这种方式,您将拥有一个新的列表,其结果(没有重复的列表)及其数量可以根据该列表的大小轻松计算。

如我在评论中所述,请删除

numberList.remove(i)
您的循环将像aspected一样工作

根据需要计算重复项的最简单方法是将列表强制转换为一个集合,并比较两者的大小。在一个集合中,所有值都是唯一的

Set<Integer> set = new HashSet<Integer>(numberList);

System.out.println( numberList.size() - set.size() );
Set Set=newhashset(numberList);
System.out.println(numberList.size()-set.size());
公共静态void countreplicates(){
整数计数=0;
List List=getNumbersFromFile();
Set unique=新哈希集(列表);
for(整数键:唯一){
if(集合频率(列表、键)>1){
计数++;
}
}
System.out.println(“重复计数”+计数);
}
公共静态列表getNumbersFromFile(){
文件编号=新文件(“src/numbers.txt”);
List numberlist=new ArrayList();
试一试{
扫描仪输入=新扫描仪(编号);
while(input.hasNextInt()){
//int number=input.nextInt();
add(input.nextInt());
//系统输出打印项次(编号);
}
System.out.println(“创建的列表”);
input.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(无接触元素异常r){
r、 printStackTrace();
System.out.println(“oops”);
}
返回数字列表;
}

当前列表的输出是什么?为什么要执行此步骤:
numberlist.remove(i)
当您删除当前元素(
remove(i)
)时,下面的元素现在将位于该位置,但当您继续循环时,
i
将递增,并且您没有计算移动到该位置的元素。当
remove()
时,需要减小
i
,这样循环的
i++
将保持
i
不变。
    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;
}