我有一个java中的对象列表,如下所示:
List<Video> videos = new ArrayList<Video>();
我的视频对象如下所示:
public class Video {
private String nameId;
private Integer id;
...
}
我有另一个列表,只有我的nameId字符串:
List<String> nameIdList = ArrayList<String>();
如何通过比较每个视频来编写一个不对我的视频列表进行排序的比较方法,而是使用另一个列表?到目前为止,我的方法是使用简单的冒泡排序,但随着我的列表变大,这将是非常低效的
示例:
我可以使用nameIds的视频对象:&#34; apple&#34;,&#34; bannana&#34;,&#34; orange&#34;
我的字符串列表可以是:&#34; bannana&#34;,&#34; apple&#34;,&#34; orange&#34;
所以我希望返回给我的客户的视频应该是以下顺序:&#34; bannana&#34;,&#34; apple&#34;,&#34; orange&#34;
答案 0 :(得分:8)
答案 1 :(得分:2)
您可以使用自定义比较器
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>
,这样您就可以更有效地查找所需的订单。
答案 2 :(得分:2)
除非所涉及的列表非常长,否则我会使用this解决方案,但这是一个具有时间复杂度O(n)
的替代解决方案。使用Comparator
和Collections.sort
或Arrays.sort
的任何解决方案的时间复杂度都不会优于O(n log n)
。
该方法根据其他列表对列表videos
进行排序,并清除列表中Video
不在其中的任何nameId
。
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);
}
答案 3 :(得分:1)
Java 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());
答案 4 :(得分:1)
一个简单而干净的解决方案,令人惊讶的是没有被提及:
videos.sort(Ordering.explicit(nameIdList).onResultOf(Video::getNameId));
Ordering.explicit是番石榴的一部分。
答案 5 :(得分:1)
您可以使用 Java 8 流
List<Video> orderedList=
nameIdList.stream()
.map(
s ->
videos.stream()
.filter(v -> v.get_id().equals(s))
.findFirst()
.orElse(null))
.collect(Collectors.toList());