在这里,我编写了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
我无法找到程序中的错误。任何人都可以帮助我吗?
答案 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在下一个文件中出现三次。在您第一次遇到它之后,它将出现在哈希中,因此当您第二次和第三次遇到它时会打印到屏幕上。