Получить значение из типа данных в Java, используя ключ или индекс - PullRequest
0 голосов
/ 09 декабря 2011

Я хотел бы иметь тип данных Java, который хранит пары ключ-значение и позволяет получать значение по ключу или по индексу.

Я свернул свой собственный тип данных, который расширяет java.util.Dictionary и предоставляет функцию at для достижения возможности поиска по индексу.

class DataHash <K,V> extends Dictionary<K,V> {
  private List<K> keyOrder = new ArrayList<K>();
  private Dictionary<K,V> internalDataStore = new Hashtable<K,V>();

  @Override
  public V put(K key, V value){
    //guards go here to prevent null, duplicate keys etc.

    this.keyOrder.add(key);
    return this.internalDataStore.put(key, value);
  }

  @Override
  public V get(K key){
    return this.internalDataStore.get(key);
  }

  public V at(int index){
    K key = this.keyOrder.get(index);
    return this.internalDataStore.get(key);
  }

  //and other functions to extend dictionary etc.
  //all keeping the keyOrder in sync with the internalDataStore
}

У меня вопрос к SO: есть ли существующий тип данных, который делает это, или более эффективный способ реализовать это в моем пользовательском типе данных?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

@ Питер, безусловно, прав (черт возьми, за его быстрые пальцы), что вы должны рассмотреть возможность использования несинхронизированного класса для реализации этого, и что HashMap лучше использовать.Я думал, что добавлю немного больше комментариев о вашем коде.

Если вы расширяете Map, вам не нужно иметь internalDataStore.Вы можете сделать что-то вроде:

class DataHash <K,V> extends HashMapK,V> {
    private List<K> keyOrder = new ArrayList<K>();

    @Override
    public V put(K key, V value){
        keyOrder.add(key);
        return super.put(key, value);
    }

    // you don't need to implement the super class methods unless you need
    // to keep keyOrder in sync

    public V at(int index){
        K key = this.keyOrder.get(index);
        return get(key);
    }
}

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

1 голос
/ 09 декабря 2011

Я бы не стал использовать словарь или хэш-таблицу, если бы вам не пришлось.

Часто интерфейс Map и класс HashMap или LinkedHashMap являются лучшим выбором, поскольку они не синхронизированы по солнечному свету. LinkedHashMap также сохраняет порядок, но не доступен по индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...