【问题标题】:What would be an efficient way to find the Common words in 3 Files in Java?在 Java 的 3 个文件中找到常用词的有效方法是什么?
【发布时间】:2018-11-30 10:01:02
【问题描述】:

我打算做的基本上是:

  1. 逐字读取第一个文件并将单词存储在一个 Set(SetA) 中。
  2. 读取第二个文件并检查第一个 Set(SetA) 是否包含该单词,如果包含则将其存储在第二个 Set(SetB) 中。现在 SetB 包含第一个和第二个文件中的常用词。
  3. 同样,我们将读取第三个文件并检查 SetB 是否包含该单词并将该单词存储在 SetC 中。

因此,如果您对我的方法有任何建议或任何问题。请提出建议。

【问题讨论】:

  • 优化将从最小的文件开始,或者理想情况下从包含最少数量的唯一词的文件开始。对于大文件,将所有单词成组存储可能会导致内存不足问题。
  • @AdriaanKoster 同意。我想了想,我觉得如果我们有多个文件,我们不能只增加 Set 的数量。我们可以只使用两个集合来实现这一点——一个包含常用词,另一个包含我们正在迭代的当前文件的唯一词。这样我们就只有两组了。
  • 所以要处理下一个文件,您需要将其所有单词存储在一个临时集中。然后确定 commonWords 集和临时集的交集(交集只包含两个集中出现的单词)。这样做的结果是新的 commonWords 集,临时集可以被丢弃。

标签: java string file


【解决方案1】:

您可以使用retainAll 确定两个集合的交集

public class App {

    public static void main(String[] args) {
        App app = new App();
        app.run();
    }

    private void run() {
        List<String> file1 = Arrays.asList("aap", "noot", "aap", "wim", "vuur", "noot", "wim");
        List<String> file2 = Arrays.asList("aap", "noot", "mies", "aap", "zus", "jet", "aap", "wim", "vuur");
        List<String> file3 = Arrays.asList("noot", "mies", "wim", "vuur");

        System.out.println(getCommonWords(file1, file2, file3));
    }

    @SafeVarargs
    private final Set<String> getCommonWords(List<String>... files) {
        Set<String> result = new HashSet<>();
        // possible optimization sort files by ascending size
        Iterator<List<String>> it = Arrays.asList(files).iterator();
        if (it.hasNext()) {
            result.addAll(it.next());
        }
        while (it.hasNext()) {
            Set<String> words = new HashSet<>(it.next());
            result.retainAll(words);
        }
        return result;
    }
}

还可以查看this answer,它显示了我在上面给出的相同解决方案,以及使用 Java 8 Streams 的方法。

【讨论】:

    【解决方案2】:

    欢迎来到 Stack Overflow!

    这种方法似乎很合理。我可以建议使用Regex 来节省您的编码时间。另一个问题是确保不存储 每个 单词,而是仅在您的集合中存储 唯一 个单词。

    【讨论】:

    • Well Set 自己负责唯一性。它是一组存储唯一对象的属性
    • 抱歉,出于某种原因,我认为您使用的是自定义实现。
    • 正则表达式有什么帮助?
    • 生成唯一列表后,您可以使用 Regex 执行匹配以查看文件中是否包含单词。只是标准模式匹配。除非 Regex 不再具有此功能。他也可以把它放在一个 for 循环中或使用另一个函数来帮助解析数据。
    猜你喜欢
    • 2020-01-28
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多