Java 将SortedSet转换为树映射或不可变映射,并使用键作为迭代器位置

Java 将SortedSet转换为树映射或不可变映射,并使用键作为迭代器位置,java,data-structures,java-stream,guava,Java,Data Structures,Java Stream,Guava,我有一个分类数据集,我的对象有一些日期比较逻辑 我想将这个SortedSet转换成树形图或番石榴的ImmutableSortedMap,其中键作为SortedSet中元素的位置 例如 我可以迭代SortedSet并手动将元素放入新的树形图中,但我想知道是否有更干净的方法通过Streams或Guava library/Collection library进行操作。使用流外部的有效最终计数器变量 因为插入是按顺序进行的,所以不需要将最终贴图作为树贴图;它可以是更快的LinkedHashMap,其迭代

我有一个分类数据集,我的对象有一些日期比较逻辑

我想将这个SortedSet转换成树形图或番石榴的ImmutableSortedMap,其中键作为SortedSet中元素的位置

例如


我可以迭代SortedSet并手动将元素放入新的树形图中,但我想知道是否有更干净的方法通过Streams或Guava library/Collection library进行操作。

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

因为插入是按顺序进行的,所以不需要将最终贴图作为树贴图;它可以是更快的LinkedHashMap,其迭代顺序与插入相同

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

如果您迫切需要树状图,请在上面的代码中将LinkedHashMap替换为树状图。

您的树状图不正是数组的概念吗

MyObject[] myObjects = sortedMap.toArray();

只要做一个循环

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

我发现这比由提出的streams方法要清楚得多。

注意,由从零开始的连续整数键索引的映射实际上是一个列表。所以,ImmutableList.copyOfyourSet可以工作。您的类实现Compariable吗?是的,它实现Compariable我不理解这一点,因为键是键的位置对不起,我的意思是元素在SortedSet中的位置我不希望仅为了这个目的而使用AtomicInteger。@新手为什么?像这样使用计数器有什么问题?另外,请注意我的答案的变化。这取决于处理顺序与遭遇顺序相同。这种假设对并行流不成立,但该规范也故意不保证顺序流的处理顺序。所以你要为线程安全构造付出代价AtomicInteger并不是免费的,因为它的解决方案不是并行工作的,它抵消了API的意图,但仍然比…复杂得多,是的,现在是这样,但我更喜欢TreeMap,因为它不会因为索引而像列表一样增长……如果你想不惜一切代价引入lambda,你仍然可以使用sortedSet.forEachitem->map.putmap.size,item;
MyObject[] myObjects = sortedMap.toArray();
TreeMap<Integer, MyClass> map = new TreeMap<>();
for (MyClass myClass : sortedSet) {
  map.put(map.size(), myClass);
}