Как выбрать первые 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