Преобразовать SortedSet в TreeMap или ImmutableMap с ключами в качестве позиции итератора - PullRequest
1 голос
/ 26 октября 2019

У меня SortedSet<MyObject> и MyObject есть логика compareTo для Date.

class MyObject {
   .. many fields
   private Date date;

   @Override
    public int compareTo(MyObject object) {
    .. logic here..
    }    

}

Я хочу преобразовать это SortedSet в TreeMap или в Guava ImmutableSortedMap с ключами в качестве позиций элемента в SortedSet.

Например,

0 -> MyObject1
1 -> MyObject2
...and so on

Я могу перебрать SortedSet и поместить элементы в новый TreeMap вручную, номне было интересно, есть ли более чистый способ сделать это с помощью потоков или библиотек Guava / библиотеки Collection.

Ответы [ 3 ]

2 голосов
/ 26 октября 2019

Просто сделайте это с помощью цикла.

TreeMap<Integer, MyClass> map = new TreeMap<>();
for (MyClass myClass : sortedSet) {
  map.put(map.size(), myClass);
}

Я считаю, что намного яснее, чем потоковый подход, предложенный Богемным .

0 голосов
/ 26 октября 2019

Разве ваша идея TreeMap не является точно, что массив будет?

MyObject[] myObjects = sortedMap.toArray();
0 голосов
/ 26 октября 2019

Используйте эффективную конечную переменную-счетчик, внешнюю по отношению к потоку.

Поскольку вставка в порядке, вам не нужно, чтобы конечная карта была TreeMap;это может быть быстрее LinkedHashMap, чей порядок итераций такой же, как и для вставки.

AtomicInteger counter = new AtomicInteger();
Map<Integer, MyClass> map = sortedSet.stream()
  .collect(Collectors.toMap(
    x -> counter.getAndIncrement(),
    x -> x,
    (a, b) -> a,
    LinkedHashMap::new));

Если вам крайне необходимо TreeMap, замените LinkedHashMap на TreeMap в приведенном выше коде.

...