Algorithm 将整数列表子列表到相同整数列表中

Algorithm 将整数列表子列表到相同整数列表中,algorithm,list,divide,sublist,Algorithm,List,Divide,Sublist,嗨,我有一个简单的问题。我从API中获取数据,它们的数据设置方式是对象有一个id,然后我将其返回到列表中 我将得到一个对象列表,如下所示: List = {Object1, Object2, Object3, ..., ObjectN}; Object: { parentId: name: //etc. } 这些对象的父id如下所示: List = {9, 9, 9, 10, 10, 10, 10} 我想将对象子列表到包含相同父id的列表中。实现这一点的合适算法是

嗨,我有一个简单的问题。我从API中获取数据,它们的数据设置方式是对象有一个id,然后我将其返回到列表中

我将得到一个对象列表,如下所示:

List = {Object1, Object2, Object3, ..., ObjectN};
Object: {
    parentId: 
    name:
    //etc.
}
这些对象的父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
编辑:我越想这个问题,就越考虑使用排序算法

感谢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;
}
public HashMap createHashMap(){
myHashMap=新HashMap();
用于(对象:mObjectList){
int parentId=object.getParentId();
如果(!myHashMap.containsKey(parentId)){
List newList=newarraylist();
put(parentId,newList);
}
myHashMap.get(parentId).add(object);
}
返回myHashMap;
}

在我正确理解上述内容之前,这是一个一直都在解决的问题。伪代码应该是这样的

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
排序相同


hashmap通常是O(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)]}

因此,如果您有对象且对象具有parentId,那么使用HashMap对对象进行排序似乎是最好的解决方案,其中HashMap键是父ID。循环遍历列表,并使用父ID作为键初始化新HashMap项和新列表(如果该项尚不存在)然后添加对象..你的用例使用地图界面的尖叫声。您可能也想考虑其他实现,例如树图。这是什么语言?这些列表是否没有像一个对象列表一样返回,其中的对象具有parentid属性?@AndyRoid您使用的是什么编程语言?如果我知道的话,我可以提供一个例子。我正在使用Java,但语言并不重要,我可以很好地阅读你的例子。如果你真的想用java来写,那就太酷了!感谢您这么快的回复和回复,我用Java实现更新了这个问题,并将继续接受您的回答。@AndyRoid真棒,希望您理解它是如何工作的!我完全同意,如果hashmap不包含该parentId,那么就用该parentId创建一个新的对象列表,一旦if语句结束,继续并将其添加到该列表中。如果它已经包含它,那么它只是循环中的一行代码。再次感谢SamV!