将整数列表列入相同整数的列表

时间:2015-03-14 23:42:43

标签: algorithm list divide sublist

嗨,我有一个简单的问题。我从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;
}

2 个答案:

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