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