Скажем, у меня есть LinkedHashMap
, содержащий 216 записей, как мне получить первые 100 значений (здесь, типа Object
) из LinkedHashMap<Integer, Object>
.
Как получить ограниченное количество значений из HashMap или LinkedHashMap?
Ответы (6)
Уродливый однострочник
Этот уродливый однострочник подойдет (и вернет ArrayList<Object>
в случае вопроса):
Collections.list(Collections.enumeration(lhMap.values())).subList(0, 100)
Это будет работать и для HashMap
, однако HashMap
при поддержке HashSet
нет гарантии, что вы получите первые 100 введенных значений; он будет работать и с другими типами с аналогичными ограничениями.
Примечания:
- относительно неэффективен (прочитайте Javadoc, чтобы узнать, почему — хотя есть и хуже!),
- будьте осторожны при использовании представлений (прочитайте Javadoc, чтобы узнать больше),
- Я упоминал, что это было некрасиво.
Пошаговый пример использования
(согласно комментарию OP)
Map<Integer, Pair<Double, SelectedRoad>> hashmap3 =
new LinkedHashMap<Integer, Pair<Double, SelectedRoad>>();
// [...] add 216 elements to hasmap3 here somehow
ArrayList<Pair<Double,SelectedRoad>> firstPairs =
Collections.list(Collections.enumeration(hashmap3.values())).subList(0, 100)
// you can then view your Pairs' SelectedRow values with them with:
// (assuming that:
// - your Pair class comes from Apache Commons Lang 3.0
// - your SelectedRoad class implements a decent toString() )
for (final Pair<Double, SelectedRoad> p : firstPairs) {
System.out.println("double: " + p.left);
System.out.println("road : " + p.right);
}
Pair<Double, SelectedRoad>
на Object
в приведенном выше примере кода. Вы получите List<Pair<Double, SelectedRoad>>
из 100 элементов.
- person haylem; 29.02.2012
ArrayList<Pair<Double,SelectedRoad>> firstPairs = Collections.list(Collections.enumeration(hashmap3.values())).subList(0, 100)
.
- person haylem; 29.02.2012
Ну, начнем с того, что делать это для HashMap
в соответствии с вашим заголовком не имеет особого смысла - HashMap
не имеет определенного порядка, и порядок может меняться между вызовами. Хотя это имеет больше смысла для LinkedHashMap
.
Там я бы использовал Guava. Iterables.limit
метод:
Iterable<Object> first100Values = Iterables.limit(map.values(), 100);
or
// Or whatever type you're interested in...
Iterable<Map.Entry<Integer, Object>> firstEntries =
Iterables.limit(map.entrySet(), 100);
Затем вы можете создать список из этого, или перебрать его, или что-то еще, что вы хотите сделать.
Ты можешь сделать:
Map<Integer, Object> records;
List<Entry<Integer, Object>> firstHundredRecords
= new ArrayList<Entry<Integer, Object>>(records.entrySet()).subList(0, 100);
Хотя учтите, что при этом будут скопированы все записи с карты.
Чтобы скопировать только нужные вам записи с помощью библиотеки.
Map<Integer, Object> records;
List<Entry<Integer, Object>> firstHundredRecords = new ArrayList<>();
for(Entry<Integer, Object> entry : records.entrySet()) {
firstHundredRecords.add(entry);
if (firstHundredRecords.size()>=100) break;
}
Map<Integer, Pair<Double,SelectedRoad>> entry
ваша IDE должна автоматически исправить это для вас.
- person Peter Lawrey; 28.02.2012
Вы можете использовать счетчик. Ваш цикл foreach завершится, когда ваш счетчик достигнет 100.
Напишите цикл, который использует Iterator.next()
100 раз, а затем останавливается.
Я собирался сказать что-то о NavigableMap
и SortedMap
, но их интерфейсы определяются в терминах ключей, а не индексов. Но тем не менее они могут быть полезны, в зависимости от того, в чем заключается ваша реальная основная проблема.