[英]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”
一个简单而干净的解决方案,令人惊讶的是没有提到:
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)
的替代解决方案。 任何使用Comparator
和Collections.sort
或Arrays.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.