如果给出每个项目的键,如何将项目列表映射到另一个桶列表?

时间:2014-06-01 08:04:42

标签: java hash bucket

我有一个项目列表,比如List<Item> listOfItems,每个项目都有一个键,比如说String cluster_key。我想将具有相同cluster_key的所有项目聚合到一个存储桶中,向我提供结果List<Bucket> listOfBuckets。存储桶列表从空开始。

有关如何优雅地使用Java的任何建议吗?也许是哈希?

我可以想到两个不太优雅的实现:

  • 暴力,我们遍历listOfItems,对于每个项目,遍历桶列表,直到我们找到匹配。如果我们找到匹配项,请将该项添加到存储桶中。否则,

for item in listOfItems {
    for bucket in listOfBuckets {
        if item.getKey() equals bucket.getKey()
            add item to bucket
        else
            create new bucket
            add item to bucket
            add bucket to listOfBuckets
    }
}
  • 排序,然后是群集:

sort listOfItems by their cluster_key;
get first item from listOfItems;
create a bucket, currentBucket, with key: firstItem.getKey()
add first item to bucket
for item in listOfItems, starting at the second item {
    if item.getKey() equals currentBucket.getKey()
        add item to currentBucket
    else
        create new bucket
        add item to new bucket
        add new bucket to listOfBuckets
        set new bucket to currentBucket
}

1 个答案:

答案 0 :(得分:2)

使用相同密钥对项目进行分组的最快方法是遍历列表并将每个项目添加到正确的存储桶(在需要时创建存储桶),这与您的第一个示例类似。

但是如果你为bucketList使用HashMap,你可以在恒定时间内向你的桶中添加项目,这将为你提供一个O(n)而不是O(n ^ 2)复杂度的算法。

未经测试,但您明白了

HashMap<String,ArrayList<Item>> bucketList = new HashMap();

for (Item i : listOfItems) {
    if(!bucketList.containsKey(i.getKey()) {
        bucketList.put(i.getKey(),new ArrayList());
    }

    buckList.get(i.getKey()).add(item);
}