gpt4 book ai didi

java - 通过匹配其他两个列表中的条目来创建新的 Java 对象列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:20 24 4
gpt4 key购买 nike

假设我有这两个列表

List<Person> persons = Arrays.asList(
new Person(1, "Mike", "Canada"),
new Person(2, "Jill", "England"),
new Person(3, "Will", "Whales"),
new Person(4, "Mary", "Spain"));


List<Metadata> metadata= Arrays.asList(
new metadata(1, "2000-01-01", "Naturalized", "Bachelor's of Arts"),
new metadata(2, "2001-01-01", "ExPat", "Masters of Chemestry"),
new metadata(3, "2017-05-01", "Citizen", "Buiness Management"),
new metadata(4, "2018-04-16", "Work Visa", "Nursing"));

最终结果是一个新列表:

List<PersonWithMetadata> personsAndMEtadata = Arrays.asList(
new PersonWithMetadata(1, "Mike", "Canada", "2000-01-01", "Naturalized", "Bachelor's of Arts"),
new PersonWithMetadata(2, "Jill", "England", "2001-01-01", "ExPat", "Masters of Chemestry"),
new PersonWithMetadata(3, "Will", "Whales", "2017-05-01", "Citizen", "Buiness Management"),
new PersonWithMetadata(4, "Mary", "Spain", "2018-04-16", "Work Visa", "Nursing"));

我正在尝试找到一种 Java 流方法,将前两个列表组合到第三个列表中——就像第一个输入是 ID 号的 SQL 连接。似乎应该有办法做到这一点,但我不知所措。这是怎么做到的?此外,假设两个输入列表之间最多只有一个匹配项。

最佳答案

YCF_L 的解决方案应该可行,但它是一个复杂度为 O(n2) 的解决方案。 O(n) 解决方案可以通过将一个列表转换为从 id 到对象的映射,然后迭代另一个并从映射中获取匹配值来实现:

Map<Integer, Person> personMap = 
persons.stream().collect(Collectors.toMap(Person::getId, Function.identity());

List<PersonWithMetadata> result =
metadata.stream()
.map(m -> new PersonWithMetadata(personMap.get(m.getId()), m)
.collect(Collectors.toList());

在示例数据中,列表具有匹配顺序的匹配对象。如果这个假设也适用于实际问题,那么解决方案可能会更简单 - 您可以流式传输 indexes 并从列表中获取相应的值:

List<PersonWithMetadata> result = 
IntStream.reange(0, persons.size())
.map(i -> new PersonWithMetadata(persons.get(i), metadata.get(i))
.collect(Collectors.toList());

关于java - 通过匹配其他两个列表中的条目来创建新的 Java 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51330996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com