根据Java中的一组键将占位符放在键/值列表中

时间:2010-01-15 17:34:05

标签: java collections

我有一组键和键/值对列表。值的格式为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做这件事的好方法是什么?

3 个答案:

答案 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有类似我怀疑的东西,但我更喜欢谷歌库。

查询没有值的键会返回一个空集合。

编辑:排序顺序,唯一性等选项都可用,只需根据您的要求选择正确的实现。