例如,我有一个列表,其中包含一些 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 都应该存储在一个集合中。
我是编程新手,还没有学过算法,也许这就是我在这方面苦苦挣扎的原因,如果有人能帮助我解决这个问题,我将不胜感激。
最佳答案
您所追求的似乎是笛卡尔积。
参见 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/