问题
我的file1在一个文件中有20,000个数字,file2在另一个文件中有9997个数字。 我想要文件2中没有的数字,即那些10,003个数字
解决方案
我创建了3个HashMap。
1)第一个HashMap存储第一个文件的记录,第二个HashMap存储第二个文件的记录,第三个HashMap存储文件记录差异的记录。
2)I Applied包含在file1中搜索file2记录的方法。如果file1记录不存在,我放入第三个hashmap。
public class ReadFromFile {
static HashMap hm=null;
static HashMap hm1=null;
static HashMap hm2=null;
private static final String FILENAME = "/home/jalaj/Download/PrimaryBase";
private static final String FILENAME1 = "/home/jalaj/Downloads/logsBase";
public static void main(String[] args) {
hm2=new HashMap<>();
int count=0;
hm=readFromFile(FILENAME);
hm1=readFromFile(FILENAME1);
Set s=hm.keySet();
Iterator it=s.iterator();
while(it.hasNext()){
String me=(String)(it.next());
if(!(hm1.containsKey(me))){
hm2.put(me,0);
count++;
}
}
System.out.println(count);
}
public static HashMap readFromFile(String FILENAME){
int count=0;
hm=new HashMap();
BufferedReader br = null;
FileReader fr = null;
try {
fr = new FileReader(FILENAME);
br = new BufferedReader(fr);
String sCurrentLine;
br = new BufferedReader(new FileReader(FILENAME));
while ((sCurrentLine = br.readLine()) != null) {
hm.put(sCurrentLine, 0);
count++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println(count);
return hm;
}
}
输出
20000
9997
0
预期产出
20000
9997
10003
答案 0 :(得分:3)
查看你的代码。在readFromFile(String name)
中,您将hm
属性重新声明为hm= new HashMap()
,并在初始化后返回。这导致hm
和hm1
都具有相同的值,因此hm2
不存储任何差异。
将此行hm= new HashMap();
更改为此HashMap hm= new HashMap();
evolià。
PD:此外,您应使用size()
代替计数变量,并使用HashSet
作为Michael Markidis建议。
编辑:在阅读他的评论之前,我意识到与迈克尔·马基迪斯一样的事情,所以伟大的思想迈克尔·马基迪斯!
答案 1 :(得分:0)
我假设file1和file2中的数字是唯一的。如果是这种情况,代码需要修改逻辑以及详细程度。我把它重构为:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class ReadFromFile {
private static final String FILENAME = "/home/jalaj/Download/PrimaryBase";
private static final String FILENAME1 = "/home/jalaj/Downloads/logsBase";
public static void main(String[] args) {
ArrayList<Integer> firstList = readFromFile(FILENAME);
ArrayList<Integer> secondList = readFromFile(FILENAME1);
ArrayList<Integer> outputList = new ArrayList<>();
for (Integer number : firstList) {
if(!secondList.contains(number)) {
outputList.add(number);
}
}
System.out.println(outputList.size());
}
public static ArrayList<Integer> readFromFile(String FILENAME){
ArrayList<Integer> list = new ArrayList<>();
try {
FileReader fr = new FileReader(FILENAME);
String sCurrentLine;
BufferedReader br = new BufferedReader(new FileReader(FILENAME));
while ((sCurrentLine = br.readLine()) != null) {
list.add(Integer.parseInt(sCurrentLine.trim()));
}
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(list.size());
return list;
}
}
此代码应产生预期的输出。