在多组Java中找到最常用的术语?

时间:2017-11-19 17:10:49

标签: java optimization merge set time-complexity

我理解通过仅包括两者中包含的项目来找到一组集合中最常见的术语的原则。

[5,1,3]
[4,2,3]

合并返回3

但是,如果我想知道可能不包含任何项目或最常见项目的集合之间最常见的项目。

如果我有:

[5,1,3]
[4,2,3]
[6,7,8]

我仍然希望3返回,因为它是集合之间最常见的项目。合并集只会返回任何内容,因为3不是其中一个集合中的元素。

任何人都知道以低时间复杂度解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:2)

最简单的方法可能是将这些集合展平为其元素,计算每个项目出现的次数,并保存最显示的那些:

Set<Integer> set1 = new HashSet<>(Arrays.asList(5 ,1, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(4, 2, 3));
Set<Integer> set3 = new HashSet<>(Arrays.asList(6, 7, 8));

Integer commonItem =
    Stream.of(set1, set2, set3)
          .flatMap(Set::stream)
          .collect(Collectors.groupingBy
                              (Function.identity(), Collectors.counting()))
          .entrySet()
          .stream()
          .sorted(Map.Entry.<Integer, Long> comparingByValue().reversed())
          .findFirst()
          .map(Map.Entry::getKey)
          .orElse(null);

注意: 此解决方案生成出现次数最多的单个元素。为了支持关系,你必须稍微调整一下。