Как выбрать первые N элементов в Java TreeMap?

#java #map

#java #словарь

Вопрос:

Учитывая эту карту

 SortedMap<Integer, String> myMap = new TreeMap<Integer, String>();
  

Существует ли служебная функция для копирования первых N элементов на карту назначения вместо цикла for?

Комментарии:

1. Я не проверял, но я бы не удивился, если бы в каком-нибудь Google Java API был однострочник для выполнения именно этого 🙂

Ответ №1:

Используя возможности Java 8 :

 TreeMap<Integer, String> myNewMap = myMap.entrySet().stream()
    .limit(3)
    .collect(TreeMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll);
  

Ответ №2:

Возможно, но не как часть стандартного Java API. И: утилита будет использовать цикл внутри.

Итак, вам понадобится цикл, но вы можете создать свою собственную «утилиту», выполнив все это в статическом методе в классе утилит:

 public static SortedMap<K,V> putFirstEntries(int max, SortedMap<K,V> source) {
  int count = 0;
  TreeMap<K,V> target = new TreeMap<K,V>();
  for (Map.Entry<K,V> entry:source.entrySet()) {
     if (count >= max) break;

     target.put(entry.getKey(), entry.getValue());
     count  ;
  }
  return target;
}
  

Сложность по-прежнему составляет O (n) (я сомневаюсь, что можно достичь O (1)), но вы используете его как инструмент, не «видя» цикл:

 SortedMap<Integer, String> firstFive = Util.putFirstEntries(5, sourceMap);
  

Ответ №3:

SortedMap.headMap() Однако вам придется передать ключ для перехода к элементу. Вы могли бы перебрать N элементов Map.keySet() , чтобы найти его, например:

 Integer toKey = null;
int i = 0;
for (Integer key : myMap.keySet()) {
    if (i   == N) {
        toKey = key;
        break;
    }
}

// be careful that toKey isn't null because N is < 0 or >= myMap.size()
SortedMap<Integer, String> copyMap = myMap.headMap(toKey);
  

Ответ №4:

Вы также можете использовать упорядоченный итератор для получения первых x записей, упорядоченный, например, по убыванию идентификатора :

 Iterator<Integer> iterator = myMap.descendingKeySet().iterator();
  

Ответ №5:

Вы можете использовать функцию putAll(Map t) для копирования элементов с карты на указанную карту.Но он копирует все элементы. Вы не можете скопировать фиксированное количество элементов.

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Map.html#putAll(java.util.Map)