2016-02-01 2 views
6

Скажем, мне нужно сохранить коллекцию объектов-учеников, и каждый ученик имеет уникальный идентификатор. Один из вариантов заключается в том, чтобы сохранить все из них в списке, но тогда, когда вы ищете студента, мне придется выполнять линейный поиск и проверять их идентификаторы. Другой вариант - использовать карту, что-то вроде: Карта, где ключи являются идентификатором студента, который сопоставляется с фактическими объектами студента.Правильное использование объектов хранения на картах

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

Моя бы добавить что-то вроде:

public void add(Student s) { 
    lookup.put(s.getId(), s); 
} 
+0

Это - то, что я делаю. Вы также можете реализовать методы equals() и hashCode на объекте вашего ученика –

+3

структуры данных не о чувствах – wero

ответ

1

Пусть эта избыточность будет только один вы когда-либо сталкиваться в программировании.

Добавленная стоимость использования карты с уникальным идентификатором объекта с точки зрения производительности и удобочитаемости стоит небольших накладных расходов, связанных с такой практикой.

Если вы действительно чувствуете, что это чрезмерное издержки слишком много, объекты, которые вы помещаете внутри своей структуры данных карты, могут быть лишены свойства ID, а свойство ID будет использоваться только как ключ, чем при извлечении, вы можете выведите идентификатор из ключа карты.

0

Настоящий правильный использование в этом случае. Вам нужно подумать над тем, что вы собираетесь делать с этой коллекцией, как только вы закончите ее строительство. Вы собираетесь перебирать его? Вы хотите отсортировать его?

Возможно создание Map, которое автоматически вытаскивает ключ из значения, но, опять же, существует предел полезности этой структуры, так как итерация или сортировка могут усложняться.

Это CurriedHashMap, что делает то, что вы рассматриваете. Игнорируйте тот факт, что под капотом используется функция HashMap.

class CurriedHashMap<K, V> extends HashMap<K, V> { 

    /** 
    * Function that extracts key from value. 
    */ 
    final Function<V, K> curry; 

    public CurriedHashMap(Function<V, K> curry) { 
     this.curry = curry; 
    } 

    /** 
    * One-value put - the key is intuited from the value using the `curry` function. 
    */ 
    public V put(V value) { 
     return super.put(curry.apply(value), value); 
    } 

} 
Смежные вопросы