Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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
按条件对Java流进行排序_Java_Collections_Functional Programming_Java 8_Java Stream - Fatal编程技术网

按条件对Java流进行排序

按条件对Java流进行排序,java,collections,functional-programming,java-8,java-stream,Java,Collections,Functional Programming,Java 8,Java Stream,我正在尝试按流的一个字段按特定顺序对流进行排序 现在,我通过将流转换为列表并使用一个开关,然后按照所需的顺序将它们重新加入到列表中来实现这一点 fruits.forEach(fruit -> { switch (fruit.getName()) { case "Orange": orangesList.add(fruit); br

我正在尝试按流的一个字段按特定顺序对流进行排序

现在,我通过将流转换为列表并使用一个开关,然后按照所需的顺序将它们重新加入到列表中来实现这一点

fruits.forEach(fruit -> { switch (fruit.getName()) { case "Orange": orangesList.add(fruit); break; case "Apple": applesList.add(fruit); break; case "WaterMelon": watermelonList.add(fruit); break; default: otherFruits.add(fruit); break; } }); genericFruitList.addAll(0, orangeList); genericFruitList.addAll(1, applesList); genericFruitList.addAll(2, watermelonList); genericFruitList.addAll(3, otherFruits); 水果。forEach(水果->{ 开关(fruit.getName()){ 案例“橙色”: 橙子列表。添加(水果); 打破 案例“苹果”: 添加(水果); 打破 案例“西瓜”: 西瓜列表。添加(水果); 打破 违约: 其他水果。添加(水果); 打破 } }); genericFruitList.addAll(0,橙色列表); genericFruitList.addAll(1,applesList); 普通水果列表。addAll(2,西瓜列表); 一般水果列表。添加所有(3,其他水果); 我想知道使用流排序方法是否有任何改变来实现这一点 使用自定义比较器或类似的东西


提前谢谢

如果您想将水果按特定顺序分类(先是桔子,然后是苹果,然后是西瓜,然后是“其他”),您可以定义一个比较器,如下所示:

List<String> order = Arrays.asList("Orange", "Apple", "Watermelon");
Comparator<Fruit> comparator = Comparator.comparing(f -> {
  int i = order.indexOf(f.getName());
  return (i >= 0) ? i : order.size();
});
List order=Arrays.asList(“橙色”、“苹果”、“西瓜”);
比较器比较器=比较器。比较(f->{
inti=order.indexOf(f.getName());
返回(i>=0)?i:order.size();
});
然后排序:

List<Fruit> genericFruitList = fruits.stream().sorted(comparator).collect(Collectors.toList());
List genericFruitList=fruits.stream().sorted(comparator.collect(Collectors.toList());

您可以使用如下显式顺序创建比较器

List<String> order = Arrays.asList("Orange", "Apple", "WaterMelon");
Comparator<String> comp
    = Comparator.comparingInt(name -> order.indexOf(name)-Integer.MIN_VALUE);
它只对每个
水果执行哈希查找,并且只对不同的映射进行排序


这可以看作是.groupingBy(Fruit::getName)
收集器的一种变体。groupingBy(Fruit::getName)将按名称对水果进行分组,如开关中所示。然后,您可以像这样执行
addAll
s。创建一个helper类可能会为您提供合适的列表:fruitHelper.getList(fruit.getName)注意,您当前的逻辑很奇怪。假设每种水果有两种:生成的
通用水果列表
将是
橙色、苹果、西瓜、其他、其他、西瓜、苹果、橙色
。您的意思是指定插入点,还是只想将它们全部添加到末尾?顺便说一句,番石榴有
Ordering.explicit(List)
,也可以在这里使用。@Eugene。此外,它不处理“其他”值。
List<Fruit> genericFruitList = fruits
    .sorted(Comparator.comparing(fruit -> fruit.getName(), comp))
    .collect(Collectors.toList());
List<Fruit> genericFruitList = fruits
    .collect(Collectors.groupingBy(fruit -> fruit.getName()))
    .entrySet().stream()
    .sorted(Map.Entry.comparingByKey(comp))
    .flatMap(e -> e.getValue().stream())
    .collect(Collectors.toList());