2

我有两个文件,它们应该在子字符串 0 和 10 之间包含相同的值,但不是按顺序排列的。我已经设法输出每个文件中的值,但我需要知道如何报告说值在第一个文件中和第二个文件中的值,反之亦然。这些文件采用这些格式。

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 的新手,可能不会轻易抓住这些想法,但我正在尝试。

4

6 回答 6

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;
}
于 2012-07-09T11:56:43.630 回答
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);
于 2012-07-09T12:03:15.413 回答
1

如果您保证文件的格式始终相同,并且每个 readLine() 函数将返回不同的数字,那么为什么不使用字符串数组而不是单个字符串。然后,您可以更轻松地比较结果。

于 2012-07-09T11:54:36.257 回答
1
  • 将每个文件中的值相应地放入两个单独HashSet的 s 中。
  • 遍历其中一个HashSets 并检查每个值是否存在于另一个 s 中HashSet。如果没有,请报告。
  • 迭代其他HashSet并为此做同样的事情。
于 2012-07-09T11:57:04.073 回答
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

EDIT 用 TreeSet 修改

于 2012-07-09T11:58:06.423 回答
1

好的,首先我会将两组字符串保存到集合中

Set<String> s1 = new HashSet<String>(), s2 = new HashSet<String>();
//...
while ((line = br.readLine()) != null) {
  //...
  s1.add(line);
}

然后您可以比较这些集合并找到两个集合中都没有出现的元素。您可以在此处找到有关如何执行此操作的一些想法。

如果您还需要知道行号,您可以创建一个字符串包装器:

class Element {
  public String str;
  public int lineNr;

  public boolean equals(Element compElement) {
    return compElement.str.equals(str);
  }
}

然后你可以Set<Element>改用。

于 2012-07-09T12:01:52.323 回答