java - 如何获得两个列表的所有可能匹配项?

标签 java algorithm

例如,我有一个列表,其中包含一些 Lecture 实例,每个讲座都有一定数量的学生参加该讲座,另一个列表包含一些 Classroom 实例,每个教室都有最大容量。

现在我打算给每个lecture in lecture list分配一个classroom in classroom list,lecture class的所有lecture都应该有一个classroom,然后创建一个map来存储这个可能性。 我想以集合的形式返回所有这些可能的匹配项。 例如:

Classroom List: [Classroom1(50),Classroom2(70),Classroom3(80)]
Lecture list:   [Lecture1(50), Lecture2(70), Lecture3(50)]

那么我们有3种可能的 map ,分别是:

{lecture1:classroom1, lecture2:classroom2, lecture3:classroom3} and
{lecture1:classroom1, lecture2:classroom3, lecture3:classroom2} and
{lecture1:classroom2, lecture2:classroom3, lecture3:classroom1}

之后,所有可能的 map 都应该存储在一个集合中。

我是编程新手,还没有学过算法,也许这就是我在这方面苦苦挣扎的原因,如果有人能帮助我解决这个问题,我将不胜感激。

最佳答案

您所追求的似乎是笛卡尔积。

enter image description here

参见 https://en.wikipedia.org/wiki/Cartesian_product

您可以使用 Java 8 流执行此操作

所有排列

// Just substitute the types and values for Lecture and Classroom instances
// I'm not going to do this for you
final List<String> first = Arrays.asList("foo","bar","baz");
final List<String> second = Arrays.asList("spam","ham","eggs");

final Set<Map.Entry<String,String>> objects = 
    first
      .stream()
      .flatMap(f -> 
         second
           .stream()
           .map(s -> new AbstractMap.SimpleEntry<>(f, s)))
      .collect(Collectors.toSet());

您的“对象”将包含包含您的组合的抽象条目映射。

Set[
  Map{foo : spam}
  Map{foo : ham}
  Map{foo : eggs}
  Map{bar : spam}
  Map{bar : ham}
  Map{bar : eggs}
  Map{baz : spam}
  Map{baz : ham}
  Map{baz : eggs}
]

组合组

如果您确实想要集合中的 3 个项目,您可以在第二个流上执行中间收集,以收集到您选择的数据结构中。下面显示了一个列表,因为我已经展示了 Collectors.toSet()

的使用
final Set<List<AbstractMap.SimpleEntry<String,String>>> objects = 
    first
      .stream()
      .map(f -> 
         second
           .stream()
           .map(s -> new AbstractMap.SimpleEntry<>(f, s))
           .collect(Collectors.toList()))
      .collect(Collectors.toSet());

您的“对象”将包含一个包含您的组合的抽象条目映射列表。

Set[
  List(
    Map{foo : spam}, Map{foo : ham}, Map{foo : eggs}
  ),
  List(
    Map{bar : spam}, Map{bar : ham}, Map{bar : eggs}
  ),
  List(
    Map{baz : spam}, Map{baz : ham}, Map{baz : eggs}
  )
]

这说明了在单个功能语句中使用 Java 8 的简单笛卡尔积算法。如果您希望添加任何子句或排除项,您可以使用 filter 或任何其他高阶函数来操作流。

关于java - 如何获得两个列表的所有可能匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43704233/

相关文章:

c++ - 以 < n 复杂度删除 vector 中的元素

algorithm - 线性搜索和二分搜索有什么区别?

java - 如何检测 Java 游戏中的按钮保持?

java - 实现人工智能隐藏在障碍物后面

java - Ajax直接进入错误部分

c# - 无法弄清楚计算时间表以在日历上显示日期的例程 - 算法

string - Lua中的字符串

java - 使用默认类型对列表进行 Jackson 反序列化

java - 在 Java 创建的 HTML 文件中表示日语字母

arrays - 通过仅检查 "open"索引的列表来查找网格中所有最大的开放矩形的列表