Как получить ограниченное количество значений из HashMap или LinkedHashMap? - PullRequest
3 голосов
/ 28 февраля 2012

Скажем, у меня есть LinkedHashMap, содержащий 216 записей, как бы я получил первые 100 значений (здесь, типа Object) из LinkedHashMap<Integer, Object>.

Ответы [ 6 ]

5 голосов
/ 28 февраля 2012

Ну, для начала, сделать это для HashMap в соответствии с вашим названием, не имеет особого смысла - у HashMap нет определенного порядка, и порядок может меняться между вызовами. Это имеет больше смысла для LinkedHashMap, хотя.

Там я бы использовал Гуава Iterables.limit метод:

Iterable<Object> first100Values = Iterables.limit(map.values(), 100);

или

// Or whatever type you're interested in...
Iterable<Map.Entry<Integer, Object>> firstEntries =
    Iterables.limit(map.entrySet(), 100);

Затем вы можете создать из этого список, или перебрать его, или все, что вы хотите сделать.

3 голосов
/ 28 февраля 2012

Гадкий однострочный

Этот уродливый однострочный сделает (и вернет ArrayList<Object> в случае вопроса):

Collections.list(Collections.enumeration(lhMap.values())).subList(0, 100)

Это будет работать и для HashMap, однако HashMap при поддержке HashSet нет гарантии, что вы получите первые 100 введенных значений; он будет работать на других типах с аналогичными ограничениями.

Примечания:

  • относительно неэффективно (прочитайте Javadoc, чтобы узнать почему - хотя есть и хуже!),
  • осторожно при использовании представлений (читайте Javadoc, чтобы узнать больше),
  • Я упоминал, что это было ужасно.

Пошаговый пример использования

(согласно комментарию ФП)

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);
}
3 голосов
/ 28 февраля 2012

Чтобы скопировать только те записи, которые вам нужны при использовании библиотеки.

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;
}
3 голосов
/ 28 февраля 2012

Вы можете сделать:

Map<Integer, Object> records;
List<Entry<Integer, Object>> firstHundredRecords
    = new ArrayList<Entry<Integer, Object>>(records.entrySet()).subList(0, 100);

Хотя учтите, что при этом будут скопированы все записи с карты.

0 голосов
/ 28 февраля 2012

Напишите цикл, который использует Iterator.next() 100 раз, а затем останавливается.

Я собирался что-то сказать о NavigableMap и SortedMap - но их интерфейсы определены в терминах ключей, а не индексов. Но, тем не менее, они могут быть полезны, в зависимости от того, что является вашей основной проблемой.

0 голосов
/ 28 февраля 2012

Вы можете использовать счетчик. Ваш цикл foreach завершится, когда ваш счетчик достигнет 100.

...