问题描述
首先,原始实现来自此处:Compare 2 text files in java and write the difference in both separately into another file
file1.txt 具有以下值:
11,12 (13,13): [0:1.0]
14,15 (16,16): [0:99]
17,18 (19,20): [0:99]
file2.txt 具有以下值:
12,11 (13,16): [0:99]
18,17 (20,19): [0:99]
首先,我阅读了所有file1.txt
并将这些元素添加到Map < String,Integer >
中。
当我开始读取第二个file2.txt
时,我会将读取的当前行与file1.txt
中的行进行比较,如果为true,则删除该行(因为我想检查第二个文件中的所有行是否都包含在第一个文件中文件)
对于我的问题,此行11,13): [0:1.0] = 12,13): [0:1.0]
,
还有这个17,20): [0:99] = 18,19): [0:99]
这是我到目前为止所做的,但是我不确定这并不是实现我想要的最佳方法。您能帮我更有效地做到这一点吗?非常感谢
BufferedReader br1 = null;
BufferedReader br2 = null;
BufferedWriter bw3 = null;
String sCurrentLine;
//HashMap<String,Integer> expectedrecords = new HashMap<String,Integer>();
HashMap<String,Integer> actualrecords = new HashMap<String,Integer>();
Map<String,Integer> expectedrecords = new ConcurrentHashMap<String,Integer>();
br1 = new BufferedReader(new FileReader("file1.txt"));
br2 = new BufferedReader(new FileReader("file2.txt"));
// create object of Path
Path path = Paths.get("file1.txt");
Path path2 = Paths.get("file2.txt");
// call getFileName() and get FileName path object
Path fileName = path.getFileName();
Path fileName2 = path2.getFileName();
while ((sCurrentLine = br1.readLine()) != null)
{
if(!Character.isDigit(sCurrentLine.charat(0)))
{
continue;
}
String splitter [] = sCurrentLine.split("[\\s,]+");
String[] pos2 = splitter[2].split("[\\s(]+");
String[] pos3 = splitter[3].split("[\\s)]+");
// Here I add the possible changes for the original line (from file1.txt) that
// Could exist in file2.txt
String sCurrentLine2 = "" +splitter[1]+ "," +splitter[0]+ " " +splitter[2]+ "," +splitter[3]+ " " +splitter[4]+ "";
String sCurrentLine3 = "" +splitter[1]+ "," +splitter[0]+ " (" +pos3[0]+ "," +pos2[1]+ "): " +splitter[4]+ "";
if(expectedrecords.containsKey(sCurrentLine))
{
expectedrecords.put(sCurrentLine,expectedrecords.get(sCurrentLine) + 1);
}
else
{
expectedrecords.put(sCurrentLine,1);
if(sCurrentLine2.equals(sCurrentLine3))
{
expectedrecords.put(sCurrentLine2,1);
}
else
{
expectedrecords.put(sCurrentLine2,1);
expectedrecords.put(sCurrentLine3,1);
}
}
}
while ((sCurrentLine = br2.readLine()) != null)
{
if(!Character.isDigit(sCurrentLine.charat(0)))
{
continue;
}
String splitter [] = sCurrentLine.split("[\\s,]+");
String[] pos2 = splitter[2].split("[\\s(]+");
String[] pos3 = splitter[3].split("[\\s)]+");
String sCurrentLine1 = "" +splitter[0]+ "," +splitter[1]+ " (" +pos3[0]+ "," +pos2[1]+ "): " +splitter[4]+ "";
String sCurrentLine2 = "" +splitter[1]+ "," +splitter[3]+ " " +splitter[4]+ "";
String sCurrentLine3 = "" +splitter[1]+ "," +pos2[1]+ "): " +splitter[4]+ "";
System.out.println("Linha atual: " +sCurrentLine);
if (expectedrecords.containsKey(sCurrentLine))
{
int expectedCount = expectedrecords.get(sCurrentLine) - 1;
if (expectedCount == 0)
{
//expectedrecords.remove(sCurrentLine);
expectedrecords.remove(sCurrentLine);
expectedrecords.remove(sCurrentLine1);
expectedrecords.remove(sCurrentLine2);
expectedrecords.remove(sCurrentLine3);
}
else
{
expectedrecords.put(sCurrentLine,expectedCount);
}
}
else
{
if (actualrecords.containsKey(sCurrentLine))
{
actualrecords.put(sCurrentLine,actualrecords.get(sCurrentLine) + 1);
}
else
{
actualrecords.put(sCurrentLine,1);
}
}
}
br1.close();
br2.close();
// expected is left with all records not present in actual
// actual is left with all records not present in expected
bw3 = new BufferedWriter(new FileWriter(new File("difference.txt")));
bw3.write("Records which are present in: "+fileName+" but it's not present in: "+fileName2+ " \n\n");
for (String key : expectedrecords.keySet())
{
for (int i = 0; i < expectedrecords.get(key); i++)
{
bw3.write(key);
bw3.newLine();
}
}
bw3.write("\nRecords which are present in: "+fileName2+" but it's not present in: "+fileName+" \n\n");
for (String key : actualrecords.keySet())
{
for (int i = 0; i < actualrecords.get(key); i++)
{
bw3.write(key);
bw3.newLine();
}
}
bw3.flush();
bw3.close();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)