将整数列表子列表转换为相同整数列表
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)]}
嗨,我有一个简单的问题。我从 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)]}