我有一个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库/馆藏库来做。
只需循环执行。
TreeMap<Integer, MyClass> map = new TreeMap<>();
for (MyClass myClass : sortedSet) {
map.put(map.size(), myClass);
}
[我发现比Bohemian提出的流方法要清晰得多。
您的TreeMap难道不知道数组将是什么?
MyObject[] myObjects = sortedMap.toArray();
在流外部使用有效的最终计数器变量。
由于已按顺序插入,因此您不需要将最终映射设为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
。