识别文本文件中的重复数字

时间:2012-01-08 13:56:06

标签: java hashmap

在这里,我编写了Java代码,以在文本文件中显示重复的数字。这里我硬编码了文本文件的路径名。我假设文本文件只包含文本文件的每一行中的数字。

我喜欢只显示那些重复的数字。代码如下所示:

import java.util.*;
import java.io.*;

public class FileRead {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashMap<String,String> lines=new HashMap<String,String>();

    try{
        FileInputStream fstream=new FileInputStream("C:/Users/kiran/Desktop/text.txt");
        DataInputStream in=new DataInputStream(fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        ArrayList arr=new ArrayList();
        String str,str1;
        int i=0;
        while((str=br.readLine())!=null){
            i++;
            str1=Integer.toString(i);
            if(lines.containsValue(str)){
                System.out.println(str);
            }else{
                lines.put(str1, str);
            }
        }
        in.close();
    }catch(Exception e){
        System.out.println(e);
    }

}
}

文本文件的内容如下所示:

 56
 75
 1
 46
 100
 97
 75
 46
 46

预期输出为:

 75
 46

这是我得到的输出:

 75
 46
 46

我无法找到程序中的错误。任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:5)

您需要跟踪已打印的内容,例如HashSet<String>

在顶部声明Set<String> seen = new HashSet<String>(),然后添加if

if(lines.containsValue(str)){
    if (seen.add(str)) {
        System.out.println(str);
    }
} else {
    lines.put(str1, str);
}

更简单的解决方案是删除else

if(lines.containsValue(str)){
    System.out.println(str);
}
lines.put(str1, str);

答案 1 :(得分:2)

最好使用Set

public static void main(String[] args) {

    final Set<Integer> set = new HashSet<Integer>();
    // Here a LinkedHashSet is used, this allows to print duplicates in
    // their order of appearance in the source file
    final Set<Integer> duplicates = new LinkedHashSet<Integer>(); 

    try{
        FileInputStream fstream = new FileInputStream("C:/Users/kiran/Desktop/text.txt");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String str;
        int i;

        while((str = br.readLine())!=null){
            i = Integer.toString(str);

            // set.add() will return false if the set is NOT modified -- ie, her
            // it will return false if the integer is already there. Hence, dup.
            if (!set.add(i))
                duplicates.add(i);
        }
        in.close();

        for (final int dup: duplicates)
            System.out.println(dup);
    } catch(Exception e) {
        System.out.println(e);
    }
}

答案 2 :(得分:2)

问题在于这段代码:

 if (lines.containsValue(str)){
     System.out.println(str);
  } else {
      lines.put(str1, str);
  }

46在文件中重复3次。第一次lines不包含46,因此会将其添加到lines。第二次和第三次,它将打印在屏幕上,因为lines已经包含46。

答案 3 :(得分:1)

你的错误是合乎逻辑的错误。数字46在下一个文件中出现三次。在您第一次遇到它之后,它将出现在哈希中,因此当您第二次和第三次遇到它时会打印到屏幕上。