【问题标题】:How do I compare many string arrays?如何比较多个字符串数组?
【发布时间】:2016-09-06 18:36:11
【问题描述】:

我有很多字符串数组,例如:

private String[] ar1= {"Cheese", "Pepperoni", "Books"};
private String[] ar2= {"Books", "Pepperoni", "Greatness"};
private String[] ar3= {"Whatever", "Whenever", "Pepperoni"};

我如何比较所有这三个数组并得到结果,即单词“Pepperoni”在 ar1、ar2 和 ar3 之间是常见的,或者例如“Books”仅在 ar2 和 ar1 之间是常见的?我可以使用 for 循环比较两个字符串数组,但是对于许多这样的数组如何做到这一点?

【问题讨论】:

  • 你期待什么形式的输出?
  • @DeendayalGarg 我希望输出是常见的单词以及常见的数组。

标签: java arrays


【解决方案1】:

我会用一套

Set<String> words = new HashSet<>(Arrays.asList(ar1));
words.retainAll(Arrays.asList(ar2));
words.retainAll(Arrays.asList(ar3));

这需要每个数组的交集。

一个更高级的选项是查看在许多数组中出现多次的单词。

Map<String, Long> words = Stream.of(ar1, ar2, ar3, ar4, ar5)
                               .flatMap(Stream::of)
                               .collect(Collectors.groupingBy(w -> w,
                                                              Collectors.counting()));

这会为您提供每个单词的地图以及它出现的次数。您可以根据需要添加更多数组。

【讨论】:

  • 简单有效,谢谢!!但是有没有办法以我可能有数十个这样的数组的方式自动化呢?
  • 第一个问题的好答案"一个单词“Pepperoni”在ar1、ar2和ar3之间很常见",但对第二个问题没有帮助"" Books”仅在 ar2 和 ar1 之间通用”。为此,您需要一个Map&lt;String, Set&lt;Integer&gt;&gt;,以显示每个单词所在的数组(Integer)。任何具有大小等于数组数量的值(Set)的映射条目都是一个答案第一个问题。
  • @Ravichandra 是的,您可以遍历所有数组
  • 您的流版本假定一个单词不能在一个数组中出现多次。问题中没有任何内容表明这是否正确,因此您应该在答案中指定这样的假设。
  • @Andreas 它假定数组是集合,但您可以包装它们以确保这一点。
【解决方案2】:

您可以创建一个字典,其中键是单词。现在,您遍历所有单词并添加到字典中:

如果单词不在字典中:

  dict[word] = 1;

其他:

  dict[word]++;

最后,您遍历字典,所有值为 3 的键都是树数组之间的公共键,您可以将这个想法用于 k 数组。 另请记住,首先您必须消除同一数组中的常用词。

【讨论】:

  • 首先,这不是 Java。其次,问题文本中没有列出保证一个单词不能在数组中多次出现,因此如果是这种情况,您的解决方案将不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2012-08-16
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多