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

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

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

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

5 ответов


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

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

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);

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

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

здесь 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);

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

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

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

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Map.html#putAll%28java.util.Map%29