将整数列表子列表转换为相同整数列表

Sublisting list of integers into lists of same integers

嗨,我有一个简单的问题。我从 API 中获取数据,他们设置数据的方式是对象有一个 id,我 return 将它放入列表中。

所以我会得到一个这样的对象列表:

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: {
    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;
}

根据以上和我的正确理解,这是一个一直在解决的问题。伪代码会是这样的..

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),所以性能应该很高。

我还是决定写一个Python版本。

它使用集合模型中的 defautdict class,因此您可以在 Java 示例的 for 循环中摆脱 if 语句,这是第一次在 defaultdict 中使用键返回一个新的空列表作为值。

与上面显示的 Java 等价的是:

from collections import defaultdict

id2obj = defaultdict(list)
for obj in objects:
    id2obj[obj.parentId].append(obj)

如果你想尝试一下,我写的小例子连同 class 定义如下:

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)]}