我觉得很有可能是一个java库函数来执行此操作,并且可能与StackOverflow上的另一个问题类似,但我在初步搜索中找不到任何内容。
我有两个onItemClick
个对象,java.util.List
和ListA
。我想使用大于ListB
的{{1}}来修改ListB
中的元素。为此,我需要将ListA
中的ID与ListA
中的相应元素相匹配(我之前的代码确保ListA
中的每个元素都位于ListB
中)然后使用ListA
中的字段修改ListB
。
哈希函数是最好的方法吗?还是有更好的方法?
编辑:这两个列表没有相同类型的对象
答案 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;
});