2015-03-14 15 views
0

Привет У меня есть простой вопрос. Я собираю данные из API и способ, которым они имеют свою настройку данных, состоит в том, что объекты имеют идентификатор, и я возвращаю его в список.Подсчет списка целых чисел в списки одинаковых целых чисел

Так что получит список объектов, например, так:

List = {Object1, Object2, Object3, ..., ObjectN}; 

И эти объекты будут иметь родительский идентификатор типа так:

List = {9, 9, 9, 10, 10, 10, 10} 

Я хочу Подсписок объектов в списки, содержащих тот же идентификатор родителя. Каким будет достойный алгоритм для решения этой задачи? Так что-то вроде этого:

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. 
} 

Edit: Чем больше я думаю об этом, тем больше я подумываю, используя алгоритм сортировки

ОТВЕТ Спасибо до СамВ:

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

Итак, если у вас есть объекты и объекты имеют parentId, кажется, что используется Ha shMap для сортировки объектов - лучшее решение, где ключи HashMap являются родительским идентификатором.Прокрутите список и инициализируйте новую запись HashMap с родительским идентификатором в качестве ключа и нового списка (если запись еще не существует), а затем добавьте объект. – SamV

+0

В вашем варианте использования крики использования интерфейса карты. Возможно, вам захочется рассмотреть и другие реализации, такие как TreeMap. – KodeSeeker

+0

На каком языке это? И списки не возвращаются вместе, как один список объектов, где объекты имеют свойство parentid? –

ответ

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), поэтому производительность должна быть высокой.

+0

тестирование прямо сейчас – AndyRoid

+0

@ AndyRoid какой язык программирования вы используете? Я мог бы предоставить пример, если я это знаю. – SamV

+0

Я использую Java, но язык не имеет значения. Я могу просто прочесть ваш пример. Если вы действительно хотите написать это в java, это будет довольно круто тоже – AndyRoid

1

В любом случае я решил написать версию Python.

Он использует класс defautdict из модели коллекций, поэтому вы можете избавиться от оператора if в цикле for примера Java, как первый раз, когда ключ используется по умолчанию, новый пустой список возвращается в качестве значения ,

Эквивалент в 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)]} 
Смежные вопросы