订购由即时设置

TOT*_*BUS 4 java collections java-stream java.time.instant

我有一个Java Set,我提供信息:

Set<myData> dataLocations = getData(location);
Run Code Online (Sandbox Code Playgroud)

我想排序这个Set我已经尝试过sortedSet并且无法让它工作,所以我尝试了这个

dataLocations = dataLocations.stream().sorted(Comparator.comparing(myData -> myData.expDtTm)).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,在Java文档中,它不保证保留任何订单.所以我尝试了这个:

TreeSet<myData> sortedDataLocations = dataLocations.stream().sorted(Comparator.comparing(myData -> myData.expDtTm)).collect(Collectors.toCollection(TreeSet<myData>));
Run Code Online (Sandbox Code Playgroud)

不用说它没有用,所以任何有任何其他想法的人都会非常感激.

Kar*_*cki 5

您可以使用TreeSet并提供比较器

TreeSet<myData> sorted = new TreeSet<>(Comparator.comparing(MyData::expDtTm));
sorted.addAll(dataLocations);
Run Code Online (Sandbox Code Playgroud)

或者如Collector课程Javadocs中所述,创建自己的收集器TreeSet:

Collector<Widget, ?, TreeSet<Widget>> intoSet =
     Collector.of(
         TreeSet::new, 
         TreeSet::add,
         (left, right) -> { left.addAll(right); return left; }
     );
Run Code Online (Sandbox Code Playgroud)

  • 您可以直接使用`Collectors.toCollection(() - > new TreeSet <>(yourComparator));而不是直接创建自定义`Collector`.它会照顾你的积累和结合. (5认同)