Java List引用另一个List来修改自己

时间:2017-07-13 15:04:26

标签: java algorithm

我觉得很有可能是一个java库函数来执行此操作,并且可能与StackOverflow上的另一个问题类似,但我在初步搜索中找不到任何内容。

我有两个onItemClick个对象,java.util.ListListA。我想使用大于ListB的{​​{1}}来修改ListB中的元素。为此,我需要将ListA中的ID与ListA中的相应元素相匹配(我之前的代码确保ListA中的每个元素都位于ListB中)然后使用ListA中的字段修改ListB

哈希函数是最好的方法吗?还是有更好的方法?

编辑:这两个列表没有相同类型的对象

4 个答案:

答案 0 :(得分:2)

您应该从Map创建ListB,将ID属性映射到与该ID对应的ListB元素。即使ListB列表是给定的,将其转换为动态Map也可能比在ListB中搜索每个元素的整个ListA更快

然后,您可以为任何B获取相应的A,并相应地修改A。这是一个简化的例子。

class A { int id; String foo; }
class B { int id; String bar; }

List<A> listA = ...
List<B> listB = ...
Map<Integer, B> mapB = listB.stream().collect(Collectors.toMap(b -> b.id, b -> b));
for (A a : listA) {
    B b = mapB.get(a.id);
    a.foo = b.bar;
}

答案 1 :(得分:0)

使用HashSet可能是您最好的选择。向HashSet添加新元素时,散列算法会为每个唯一元素提供一个键。如果您要检查ID,Hash密钥可能就是您的答案。此外,您保留的先前代码可能会过时,因为如果您愿意,HashSet会将ListA中的每个元素添加到ListB。我想给你更具体的建议,但你的问题很模糊。

答案 2 :(得分:0)

答案是:依赖。

使用的最佳数据结构取决于您的确切要求。当您的主要(几乎唯一)用例是基于列表A中的条目从列表B中获取对象时 - 那么自然选择将是Map<ID, ListBEntry>。这可能意味着你最终没有列表B;只是那张地图。

但是如果他们是其他使用模式,你可能需要保留一张地图和两个列表。

或者,如果你的约束是内存(不是CPU周期/性能),你甚至可能只需要两个列表和搜索列表,每次匹配值。

答案 3 :(得分:0)

我认为tobias_k's answer绝对正确。在这里,我想展示一种不同的编码方式:

Map<ID, B> map = new HashMap<>();
listB.forEach(b -> map.put(b.getID(), b));

listA.replaceAll(a -> {
    B b = map.get(a.getID());
    // modify a with b here
    return a;
});