繁体   English   中英

如何通过另一个 id 列表对 java 中的列表进行排序

[英]How can I sort a list in java by another list of ids

我有一个 java 中的对象列表,看起来像这样:

List<Video> videos = new ArrayList<Video>();

我的视频对象如下所示:

public class Video {
    private String nameId;
    private Integer id;
    ...
}

我有另一个列表,其中只有我的 nameId 字符串:

List<String> nameIdList = ArrayList<String>();

如何编写一个 compareto 方法,该方法不会通过比较每个视频来对我的视频列表进行排序,而是使用另一个列表? 到目前为止,我的方法是使用简单的冒泡排序,但随着我的列表变大,这将非常低效

例子:

我可以拥有 nameIds 的视频对象:“apple”、“bannana”、“orange”

我用来排序的字符串列表可能是:“bannana”、“apple”、“orange”

所以我想返回给我的客户的视频应该按以下顺序排列:“bannana”、“apple”、“orange”

爪哇 8:

videos.sort(Comparator.comparing(v->nameIdList.indexOf(v.getNameId())));

这比

一个简单而干净的解决方案,令人惊讶的是没有提到:

videos.sort(Ordering.explicit(nameIdList).onResultOf(Video::getNameId));

Ordering.explicit是 Guava 的一部分。

您可以使用自定义比较器

List<String> nameIdList = new ArrayList<>();
Comparator<Video> compare = new Comparator<Video>() {
     public int compare(Video v1, Video v2) {
         return nameIdList.indexOf(v1.getNameId()) - nameIdList.indexOf(v2.getNameId());
     }
};

为了提高效率,您可以使用Map<String, Integer>以便更有效地查找所需的顺序。

除非涉及的列表长,否则我会使用这个解决方案,但这里有一个时间复杂度为O(n)的替代解决方案。 任何使用ComparatorCollections.sortArrays.sort解决方案的时间复杂度都不比O(n log n)

该方法根据另一个列表对列表videos排序,并清除nameId不在列表中的任何Video

public static void sort(List<Video> videos, List<String> list) {
    Map<String, List<Video>> map = new HashMap<>();
    for (String string : list)
        map.put(string, new ArrayList<>());
    for (Video video : videos) {
        List<Video> value = map.get(video.getNameId());
        if (value != null)
            value.add(video);
    }
    videos.clear();
    for (String string : list)
        for (Video video : map.get(string))
            videos.add(video);
}

Java 8. 转换为 map 并通过哈希选择:

Map<String, Video> videoMap = videos.stream()
         .collect(Collectors.toMap(Video::getNameId, v -> v));

return videos.stream()
         .map(v -> videoMap.get(v))
         .collect(Collectors.toList());

您可以使用 Java 8 流

List<Video> orderedList=
              nameIdList.stream()
                  .map(
                      s ->
                          videos.stream()
                              .filter(v -> v.get_id().equals(s))
                              .findFirst()
                              .orElse(null))
                  .collect(Collectors.toList());
              

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM