Как получить n-й предмет из TreeMap? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть TreeMap<Date, Integer>, и я хочу получить n -й элемент с этой карты. То, что я придумал сейчас, это:

((Integer)myTreeMap.values().toArray()[index]).intValue();

но это кажется довольно неуклюжим, не говоря уже о том, что происходит в куче или с производительностью?

Есть ли краткий способ получить n -й предмет из TreeMap / SortedMap?

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Редактировать: альтернатива

final Optional<T> first =
        treeMap.values()
               .stream()
               .skip(index - 1)
               .findFirst();

if (first.isPresent()) {
    final T value = first.get();
}

Как насчет

final List<T> values = new ArrayList<>(myTreeMap.values());
final T value = values.get(index);

T - это просто универсальный тип вместо вашего Map типа значения.
index это ваш nth элемент.

Как указывалось, это неэффективно для больших карт, поскольку внутри конструктора ArrayList метод toArray называется

public Object[] toArray() {
    // Estimate size of array; be prepared to see more or fewer elements
    Object[] r = new Object[size()];
    Iterator<E> it = iterator();
    for (int i = 0; i < r.length; i++) {
        if (! it.hasNext()) // fewer elements than expected
            return Arrays.copyOf(r, i);
        r[i] = it.next();
    }
    return it.hasNext() ? finishToArray(r, it) : r;
}
1 голос
/ 23 марта 2019

Мы можем попробовать использовать поток здесь.В приведенном ниже фрагменте мы создаем отсортированную карту с пятью записями.Затем мы создаем поток, пропуская первые 3 элемента и используя findFirst для захвата первого элемента.

Map<Integer, String> myTreeMap = new TreeMap<>();
myTreeMap.put(1, "one");
myTreeMap.put(2, "two");
myTreeMap.put(3, "three");
myTreeMap.put(4, "four");
myTreeMap.put(5, "five");
String fourth = myTreeMap.entrySet().stream()
   .skip(3)
   .map(map -> map.getValue()).findFirst().get();
System.out.println("fourth value in map is: " + fourth);
0 голосов
/ 23 марта 2019

Вы можете использовать steam и пропустить n-1 элементы и взять первый, как показано ниже: tmap.entrySet().stream().skip(n-1).findFirst();. Подробности с примерами набора данных:

TreeMap<Date, Integer> tmap = new TreeMap<Date, Integer>();
tmap.put(new Date(2014, 1, 1), 0);
tmap.put(new Date(2015, 1, 1), 1);
tmap.put(new Date(2016, 1, 1), 2);
tmap.put(new Date(2017, 1, 1), 3);
tmap.put(new Date(2018, 1,1 ), 4);

System.out.println(tmap);

// Let's find the nth elements i.e n = 3;
int n = 3;
System.out.println(" " + n + " elements: ");
System.out.println(tmap.entrySet().stream().skip(n-1).findFirst());

Вывод следующим образом:

{Sun Feb 01 00:00:00 IST 3914=0, Mon Feb 01 00:00:00 IST 3915=1, Tue Feb 01 00:00:00 IST 3916=2, Thu Feb 01 00:00:00 IST 3917=3, Fri Feb 01 00:00:00 IST 3918=4}
3 elements: 
Optional[Tue Feb 01 00:00:00 IST 3916=2]
...