有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个java中的对象列表,如下所示:

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

我的视频对象如下所示:

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

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

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

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

例如:

我可以有名称ID为“apple”、“bannana”、“orange”的视频对象

我的字符串列表可以是:“bannana”、“apple”、“orange”

因此,我想返回给我的客户的视频顺序应该是:“bannana”、“apple”、“orange”


共 (6) 个答案

  1. # 1 楼答案

    Java 8:

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

    这比this

  2. # 2 楼答案

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

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

    Ordering.explicit是番石榴的一部分

  3. # 3 楼答案

    除非所涉及的列表非常长,否则我将使用this解决方案,但这里有一个具有时间复杂性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);
    }
    
  4. # 4 楼答案

    您可以使用自定义比较器

    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>,以便更有效地查找所需的顺序

  5. # 5 楼答案

    爪哇8。转换为映射并按哈希拾取:

    Map<String, Video> videoMap = videos.stream()
             .collect(Collectors.toMap(Video::getNameId, v -> v));
    
    return videos.stream()
             .map(v -> videoMap.get(v))
             .collect(Collectors.toList());
    
  6. # 6 楼答案

    您可以使用Java8流

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