我有两个文件,它们应该在子串0和10之间包含相同的值,但不按顺序排列。我有管理来打印每个文件中的值,但我需要知道如何报告说id,值在第一个文件中,而在第二个文件中,反之亦然。文件采用这些格式。
6436346346....Other details
9348734873....Other details
9349839829....Other details
第二档
8484545487....Other details
9348734873....Other details
9349839829....Other details
第一个文件中的第一个记录未出现在第二个文件中,第二个文件中的第一个记录未出现在第一个文件中。我需要能够以这种格式报告这种不匹配:
Record 6436346346 is in the firstfile and not in the secondfile.
Record 8484545487 is in the secondfile and not in the firstfile.
这是我目前拥有的代码,它为我提供了两个要比较的文件所需的输出。
package compare.numbers;
import java.io.*;
/**
*
* @author implvcb
*/
public class CompareNumbers {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
File f = new File("C:/Analysis/");
String line;
String line1;
try {
String firstfile = "C:/Analysis/RL001.TXT";
FileInputStream fs = new FileInputStream(firstfile);
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
while ((line = br.readLine()) != null) {
String account = line.substring(0, 10);
System.out.println(account);
}
String secondfile = "C:/Analysis/RL003.TXT";
FileInputStream fs1 = new FileInputStream(secondfile);
BufferedReader br1 = new BufferedReader(new InputStreamReader(fs1));
while ((line1 = br1.readLine()) != null) {
String account1 = line1.substring(0, 10);
System.out.println(account1);
}
} catch (Exception e) {
e.fillInStackTrace();
}
}
}
请帮助我如何有效地实现这一目标。 我想我需要说这是java的新手,可能不会轻易抓住这些想法但是我正在尝试。
答案 0 :(得分:2)
以下是执行此操作的示例代码:
public static void eliminateCommon(String file1, String file2) throws IOException
{
List<String> lines1 = readLines(file1);
List<String> lines2 = readLines(file2);
Iterator<String> linesItr = lines1.iterator();
while (linesItr.hasNext()) {
String checkLine = linesItr.next();
if (lines2.contains(checkLine)) {
linesItr.remove();
lines2.remove(checkLine);
}
}
//now lines1 will contain string that are not present in lines2
//now lines2 will contain string that are not present in lines1
System.out.println(lines1);
System.out.println(lines2);
}
public static List<String> readLines(String fileName) throws IOException
{
List<String> lines = new ArrayList<String>();
FileInputStream fs = new FileInputStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
String line = null;
while ((line = br.readLine()) != null) {
String account = line.substring(0, 10);
lines.add(account);
}
return lines;
}
答案 1 :(得分:2)
也许您正在寻找类似的东西
Set<String> set1 = new HashSet<>(FileUtils.readLines(new File("C:/Analysis/RL001.TXT")));
Set<String> set2 = new HashSet<>(FileUtils.readLines(new File("C:/Analysis/RL003.TXT")));
Set<String> onlyInSet1 = new HashSet<>(set1);
onlyInSet1.removeAll(set2);
Set<String> onlyInSet2 = new HashSet<>(set2);
onlyInSet2.removeAll(set1);
答案 2 :(得分:1)
如果您保证文件的格式始终相同,并且每个readLine()函数将返回不同的数字,为什么不使用字符串数组,而不是单个字符串。然后,您可以更轻松地比较结果。
答案 3 :(得分:1)
HashSet
中。HashSet
并检查另一个HashSet
中是否存在每个值。如果没有报告。HashSet
并为此做同样的事情。答案 4 :(得分:1)
打开两个扫描仪,然后:
final TreeSet<Integer> ts1 = new TreeSet<Integer>();
final TreeSet<Integer> ts2 = new TreeSet<Integer>();
while (scan1.hasNextLine() && scan2.hasNexLine) {
ts1.add(Integer.valueOf(scan1.nextLigne().subString(0,10));
ts1.add(Integer.valueOf(scan1.nextLigne().subString(0,10));
}
You can now compare ordered results of the two trees
修改强> 用TreeSet修改
答案 5 :(得分:1)
好的,首先我要将两组字符串保存到集合
Set<String> s1 = new HashSet<String>(), s2 = new HashSet<String>();
//...
while ((line = br.readLine()) != null) {
//...
s1.add(line);
}
然后您可以比较这些集并找到两个集中都没有出现的元素。您可以找到有关如何执行此操作的一些想法here。
如果您还需要知道行号,您可以创建一个String包装器:
class Element {
public String str;
public int lineNr;
public boolean equals(Element compElement) {
return compElement.str.equals(str);
}
}
然后您可以改为使用Set<Element>
。