我有一个项目列表,比如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
}
答案 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);
}