【问题标题】:Parsing 2 Files Line-By-Line and need to avoid Duplicates (in special cases)逐行解析 2 个文件并需要避免重复(在特殊情况下)
【发布时间】:2013-09-27 01:21:49
【问题描述】:

我有 2 个文件正在逐行解析,将信息添加到 2 个单独的 ArrayList<String> 容器中。我正在尝试创建一个最终容器“finalPNList”,它反映了下面的“结果文件/数组列表”。

问题是我没有成功避免重复。我已经以各种方式更改了代码但没有成功。有时我限制条件太多,避免所有重复,有时我把它放得太松,包括所有重复。我似乎找不到使它恰到好处的条件。

这是目前为止的代码——在这种情况下,看到 processLine() 的内容并不真正相关,只要知道你得到一张带有 2 个 ArrayLists<String> 的地图

public static Map<String, List<String>> masterList = new HashMap<String, List<String>>();
public static List<String> finalPNList = new ArrayList<String>();
public static List<String> modifier = new ArrayList<String>();
public static List<String> skipped = new ArrayList<String>();

for (Entry<String, String> e : tab1.entrySet()) {
    String key = e.getKey();
    String val = e.getValue();

    // returns BufferedReader to start line processing
    inputStream = getFileHandle(val);
    // builds masterList containing all data
    masterList.put(key, processLine(inputStream));
}
for (Entry<String, List<String>> e : masterList.entrySet()) {
    String key = e.getKey();
    List<String> val = e.getValue();
    System.out.println(modifier.size());
    for (String s : val) {
        if (modifier.size() == 0)
            finalPNList.add(s);
        if (!modifier.isEmpty() && finalPNList.contains(s)
                && !modifier.contains(key)) {
            // s has been added by parent process so SKIP!
            skipped.add(s);
        } else
            finalPNList.add(s);    
    }    
    modifier.add(key);
}

这是数据的样子(非常简化,每个文件大约 20K 行,大约 10K 行):

文件 A

123;data
123;data
456,data

文件 B

123;data
789,data
789,data

结果文件/数组列表

123;data
123;data
789,data
789,data

【问题讨论】:

  • 你的预期输出是什么?
  • 我期望的输出在我的帖子的结果文件部分......最后一块
  • 您能否更详细地解释一下您希望如何处理重复项的规则?从上面的例子还不清楚。
  • @Meesh 很抱歉不太清楚。这就是难题的核心——本质上,文件 A 中的所有数据都应该进入输出文件,但是,文件 B 中的数据只有在它不存在的情况下才应该添加(由文件 A 提供)。如果它存在,请将其添加到“存在”的 ArrayList 以供审核...我对此进行了说明,但最终删除了太多。我可以在我的线程中添加一些示例,但我想尽量减少它以避免混乱。

标签: java algorithm arraylist duplicates name-collision


【解决方案1】:
  • !modifier.contains(key) 总是正确的,它可以从你的 if 语句中删除。
  • modifier.size() == 0 可以替换为 modifier.isEmpty()
  • 由于您似乎想从文件 B 添加重复项,因此在检查是否存在时需要检查文件 A,而不是 finalPNList(我刚刚检查了 masterList 中的适用列表,请随时将其更改为更多内容适当/有效)。
  • 您需要在您的第一个 if 语句之后有一个 else,否则您会从文件 A 添加两次。
  • 我假设您只是在输出中错过了456,否则我可能不太明白。

将文件 IO 的修改代码替换为更符合 SSCCE 精神的东西:

masterList.put("A", Arrays.asList("123","123","456"));
masterList.put("B", Arrays.asList("123","789","789"));
for (Map.Entry<String, List<String>> e : masterList.entrySet()) {
    String key = e.getKey();
    List<String> val = e.getValue();
    System.out.println(modifier.size());
    for (String s : val) {
        if (modifier.isEmpty())
            finalPNList.add(s);
        else if (!modifier.isEmpty() && masterList.get("A").contains(s)) {
            // s has been added by parent process so SKIP!
            skipped.add(s);
        } else
            finalPNList.add(s);    
    }    
    modifier.add(key);
}

Test.

【讨论】:

  • 我会在几分钟内试一试,如果它有效,请告诉您 - 感谢您的时间和精力。请确保我会回来确认这是否成功。
  • 这一行让一切变得不同:"&& masterList.get("A").contains(s)" 感谢您的时间和精力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多