Java 为什么我的程序不计算某个列表中的每个重复数字,而是计算所有其他数字
我试图计算从大约20000个值的文件创建的ArrayList中重复整数的数量,每个值由一个换行符分隔。我当前的代码适用于每一个列表,除了一个我无法轻易更改并且被卡住的特定列表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
//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循环跳过一个元素。实际上,您删除了元素numberi
,下一次求值应该从numberi
开始,而不是从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;
}