我有一组键和键/值对列表。值的格式为Long,BigInteger。
// key/values pairs: Long,BigInteger
List<Object[]> values;
// id list that corresponds to the keys for the list above
Set<Long> ids;
如果键集中的任何成员不存在作为键/值列表中的键,我想将其添加到值为0的列表中。
用Java做这件事的好方法是什么?
答案 0 :(得分:4)
各种评论者提出的地图是一个很好的观点。怎么样而不是
List<Object[]> values
你使用
Map<Long, BigInteger> values
在那种情况下:
for(Long id : ids) {
if(!values.containsKey(id)) {
values.put(id, BigInteger.ZERO);
}
}
实际上,即使代码必须保持为已编写,我也会考虑通过将列表预处理到映射中来使用映射进行操作,然后将其转储回对象数组列表中。
答案 1 :(得分:3)
用Java做这件事的好方法是什么?
将Set<Long>
和List<Object[]>
替换为Map<Long, BigInteger>
。如果排序不重要,请使用HashMap
。如果您想自动对密钥进行排序,请使用TreeMap
。如果您想维护广告订单,请使用LinkedHashMap
。
E.g。
Map<Long, BigInteger> unorderedMap = new HashMap<Long, BigInteger>();
Map<Long, BigInteger> orderedByKeys = new TreeMap<Long, BigInteger>();
Map<Long, BigInteger> orderedByInsertion = new LinkedHashMap<Long, BigInteger>();
这样您就可以使用任何Map
方法来处理键/值对。 E.g。
Long key = 1L;
BigInteger value = map.get(key);
if (value == null) {
value = new BigInteger(0);
map.put(key, value);
}
您甚至可以通过Map#keySet()
获取所有密钥:
Set<Long> keys = map.keySet();
要了解有关地图的详情,请参阅Sun's own tutorial有关该主题的内容。
答案 2 :(得分:1)
我认为您希望使用类似Google Collections Multimap实现之一的内容。不要重新发明轮子。 Apache Commons有类似我怀疑的东西,但我更喜欢谷歌库。
查询没有值的键会返回一个空集合。
编辑:排序顺序,唯一性等选项都可用,只需根据您的要求选择正确的实现。