嘿,我想排序照片的名称,首先我要所有的照片有一个字“简介”,然后比较其余的目前我只按名字排序
photos .stream() .sorted(Comparator.comparing(Photo::getFileName)) .collect(Collectors.toList());
我怎样才能做到这一点?谢谢
wpx232ag1#
您需要编写自己的比较器接口实现。因为你的流包含 Photo 元素,你需要一个 Comparator 相比之下 Photo 物体。
Photo
Comparator
Comparator<Photo> comparator = (Photo p1, Photo p2) -> { String p1Filename = p1.getFileName(); String p2Filename = p2.getFileName(); if (p1Filename.contains("profile") { if (p2Filename.contains("profile") { String tmp1 = p1Filename.replaceFirst("profile", ""); String tmp2 = p2Filename.replaceFirst("profile", ""); return tmp1.compareTo(tmp2); } else { return 1; } } else { if (p2Filename.contains("profile") { return -1; } else { return p1Filename.compareTo(p2Filename); } } };
那你就把那个传过去 Comparator 你的流操作。
photos.stream() .sorted(comparator) .collect(Collectors.toList());
qvk1mo1f2#
写入逻辑以确定排序“优先级”,值越低优先级越高,例如。0=包含“配置文件”1=其他一切然后先按优先级排序,然后再按名称排序。在下面的示例中,我们将regex用于不区分大小写的“contains”检查,并预编译它以获得更好的性能。
Pattern containsProfile = Pattern.compile("profile", Pattern.CASE_INSENSITIVE); photos.stream() .sorted(Comparator.comparingInt((Photo p) -> containsProfile.matcher(p.getFileName()).find() ? 0 : 1) .thenComparing(Photo::getFileName)) .collect(Collectors.toList());
xj3cbfub3#
你可以试试:
photos.stream() .sorted((s1, s2) -> .collect(Collectors.toList());
3条答案
按热度按时间wpx232ag1#
您需要编写自己的比较器接口实现。
因为你的流包含
Photo
元素,你需要一个Comparator
相比之下Photo
物体。那你就把那个传过去
Comparator
你的流操作。qvk1mo1f2#
写入逻辑以确定排序“优先级”,值越低优先级越高,例如。
0=包含“配置文件”
1=其他一切
然后先按优先级排序,然后再按名称排序。
在下面的示例中,我们将regex用于不区分大小写的“contains”检查,并预编译它以获得更好的性能。
xj3cbfub3#
你可以试试: