将键转换为迭代器位置的SortedSet转换为TreeMap或ImmutableMap

问题描述 投票:1回答:3

我有一个SortedSet<MyObject>MyObject对于compareTo具有一些Date逻辑。

class MyObject {
   .. many fields
   private Date date;

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

}

我想用键作为SortedSet中元素的位置,将此TreeMap转换为ImmutableSortedMap或番石榴的SortedSet

例如

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

我可以遍历SortedSet并将元素手动放入新的TreeMap中,但我想知道是否有更干净的方法可以通过Streams或Guava库/馆藏库来做。

java data-structures java-stream guava
3个回答
2
投票

只需循环执行。

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

[我发现比Bohemian提出的流方法要清晰得多。


0
投票

您的TreeMap难道不知道数组将是什么?

MyObject[] myObjects = sortedMap.toArray();

0
投票

在流外部使用有效的最终计数器变量。

由于已按顺序插入,因此您不需要将最终映射设为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

© www.soinside.com 2019 - 2024. All rights reserved.