排序—java排序(如果包含),然后按排序

bxfogqkk  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(296)

嘿,我想排序照片的名称,首先我要所有的照片有一个字“简介”,然后比较其余的
目前我只按名字排序

photos
            .stream()
            .sorted(Comparator.comparing(Photo::getFileName))
            .collect(Collectors.toList());

我怎样才能做到这一点?谢谢

wpx232ag

wpx232ag1#

您需要编写自己的比较器接口实现。
因为你的流包含 Photo 元素,你需要一个 Comparator 相比之下 Photo 物体。

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());
qvk1mo1f

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());
xj3cbfub

xj3cbfub3#

你可以试试:

photos.stream()
      .sorted((s1, s2) -> 
      .collect(Collectors.toList());

相关问题