Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8在给定一组有序键的情况下,按键对映射进行排序_Java_Sorting_Java 8_Java Stream - Fatal编程技术网

Java8在给定一组有序键的情况下,按键对映射进行排序

Java8在给定一组有序键的情况下,按键对映射进行排序,java,sorting,java-8,java-stream,Java,Sorting,Java 8,Java Stream,我想在Java8中使用按键流对映射进行排序,但顺序是在有序集中定义的 订购键: LinkedHashSet<String> keysToOrderBy = new LinkedHashSet<String>(); keysToOrderBy.add("b"); keysToOrderBy.add("c"); keysToOrderBy.add("d"); keysToOrderBy.add("a"); keysToOrderBy.add("e"); 我假设我必须使用自定

我想在Java8中使用按键流对映射进行排序,但顺序是在有序集中定义的

订购键:

LinkedHashSet<String> keysToOrderBy = new LinkedHashSet<String>();
keysToOrderBy.add("b");
keysToOrderBy.add("c");
keysToOrderBy.add("d");
keysToOrderBy.add("a");
keysToOrderBy.add("e");

我假设我必须使用自定义比较器?

您不必使用自定义比较器;您只需迭代已排序的元素,而不是未排序的元素

LinkedHashMap<String, Object> ordered = keysToOrderBy.stream()
    .filter(map::containsKey)
    .collect(Collectors.toMap(
                e -> e,
                map::get, 
                (v1, v2) -> v1, LinkedHashMap::new));
LinkedHashMap ordered=keysToOrderBy.stream()
.filter(映射::containsKey)
.collect(collector.toMap)(
e->e,
地图::获取,
(v1,v2)->v1,LinkedHashMap::new);

顺便问一下,并行是否会影响迭代的顺序?因为我希望订单有秩序,并确保它的效率。我可能要整理多达100把钥匙。也许对于100键的直接迭代是可以的,我想。但是任何我可以节省时间的地方都是好的。对于几百个键,并行化要比一开始就按顺序进行要慢。你必须有更大的数据,并行性才值得。对此我有一些建议。一般来说,在你做了数学和测量以证明不是这样之前,总是假设并行化操作会使它们变慢。我相信并行化是可行的,但即便如此,它更可能损害性能而不是帮助性能。我需要在1000张地图上的100个关键点上进行并行化。可能还不够大。我会通过测试发现…在这种情况下,在地图上并行化可能是最好的方法,而不需要在条目上并行化。
LinkedHashMap<String, Object> ordered = 
      map.entrySet()
               .stream()
               .parallel()
               .sorted(Map.Entry.comparingByKey())
               .collect(Collectors.toMap(
                   Map.Entry::getKey,
                   Map.Entry::getValue, 
                   (v1, v2) -> v1,
                   LinkedHashMap::new
               ));
"b"
"c"
"d"
"a"
"e"
LinkedHashMap<String, Object> ordered = keysToOrderBy.stream()
    .filter(map::containsKey)
    .collect(Collectors.toMap(
                e -> e,
                map::get, 
                (v1, v2) -> v1, LinkedHashMap::new));