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

Учитывая это отображение

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

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

Ответ 1

Возможно, но не как часть стандартного 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);

Ответ 2

Там 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);

Ответ 3

Использование мощности Java 8 +:

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

Ответ 5

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

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