嗨,我有一个简单的问题。我从API中获取数据,并且他们的数据设置方式是对象具有id并将其返回到列表中。
所以我会得到一个像这样的对象列表:
List = {Object1, Object2, Object3, ..., ObjectN};
这些对象将具有如下的父ID:
List = {9, 9, 9, 10, 10, 10, 10}
我想将对象子列表到包含相同父ID的列表中。什么是一个不错的算法来完成这个?所以像这样:
Object1's parent id is 9
Object2's parent id is 9
Object3's parent id is 9
Object4's parent id is 10
Object5's parent id is 10
Object6's parent id is 10
List<Object> = {Object1, Object2, Object3} // List of all objects with parent id 9
List<Object> = {Object4, Object5, Object6} // List of all objects with parent id 10
我还想过使用HashMap
,那是不错的做法?出于扩展目的,我相信对象列表永远不会超过数百或数千,所以我不认为速度在这里是一个巨大的问题。
背景:语言是Java,而Object将有如下参数:
Object: {
parentId:
name:
//etc.
}
编辑:我想的越多,我就越考虑使用排序算法
答案谢谢SamV:
public HashMap<Integer, List<Object>> createHashMap() {
myHashMap = new HashMap<>();
for (Object object : mObjectList) {
int parentId = object.getParentId();
if (!myHashMap.containsKey(parentId)) {
List<Object> newList = new ArrayList<>();
myHashMap.put(parentId, newList);
}
myHashMap.get(parentId).add(object);
}
return myHashMap;
}
答案 0 :(得分:1)
在此之前,我正确理解这是一个一直在解决的问题。伪代码会像这样......
fn sortObjects(List objects) {
var sortedParentHashMap = new HashMap();
foreach(object in objects) {
// If the HashMap entry for the current parentId does not exist then initialize
if (!sortedParentHashMap.exists(object.parentId))
// Initialize the entry with a new list
sortedParentHashMap.put(object.parentId, new List());
}
// Now put the object within the specified parentId list
sortedParentHashMap.get(object.parentId).put(object);
}
return sortedParentHashMap();
}
您使用每个对象的parentId
为您执行排序。您可以访问该parentId
的条目并将该对象添加到列表中。如果您有重复项,则可以使new List()
HashMap以与parentId
排序相同的方式检测重复项。
HashMaps通常为O(1),因此性能应该很高。
答案 1 :(得分:1)
无论如何我决定写一个Python版本。
它使用集合模型中的defautdict类,因此您可以删除Java示例的for循环中的if语句,因为第一次在defaultdict中使用键时,将返回一个新的空列表作为值。
与上面显示的Java相同的是:
from collections import defaultdict
id2obj = defaultdict(list)
for obj in objects:
id2obj[obj.parentId].append(obj)
如果你想尝试一下,那么我写的小例子和类定义如下:
from pprint import pprint as pp
from collections import defaultdict
class AnObject():
def __init__(self, parentId, name):
self.parentId, self.name = parentId, name
def __repr__(self):
return "%s(%i)" % (self.name, self.parentId)
objects = [AnObject(id, "Obj%i" % n)
for n, id in enumerate([9, 9, 9, 10, 10, 10, 10], 1)]
print('# OBJECTS')
pp(objects)
id2obj = defaultdict(list)
for obj in objects:
id2obj[obj.parentId].append(obj)
print('\n# BY ID')
pp(dict(id2obj))
程序输出为:
# OBJECTS
[Obj1(9), Obj2(9), Obj3(9), Obj4(10), Obj5(10), Obj6(10), Obj7(10)]
# BY ID
{9: [Obj1(9), Obj2(9), Obj3(9)], 10: [Obj4(10), Obj5(10), Obj6(10), Obj7(10)]}