[英]How to sort list of locale objects in list interface using comparator in java
[英]How to use Java Comparator Interface to sort an Object list with reference to another list that has ids
我有一个名为ArtWork
的实体,该实体具有多个领域。
对于某些功能,我向MySql查询艺术品List<ArtWork> artworks
。 我也有另外一个List
类型的Long
- List<Long> artworkIds
。
在'artworks'
名单将有属于任何ID中的对象'artworksIds'
列表中,但不是在为了作为'artworkIds'
。
因此,我想将列表排序'artworks'
的ID,参照目前在列表中的ID的顺序'artworkIds'
。
想要使用Comparator
来实现这一目标
谢谢
我将把Artwork实例存储在一个键为artworkID的地图中。
然后,我将遍历ArtworkID的列表,并按要求的顺序通过其ID从地图中获取艺术品。
如果您坚持使用Comparator解决方案(我不推荐这样做),则可以执行以下操作:
public int compare(ArtWork o1, ArtWork o2) {
int i1 = listOfIDs.indexOf(o1.getID());
int i2 = listOfIDs.indexOf(o2.getID());
return (i1 < i2) ? -1 : ((i1 > i2) ? 1 : 0) ;
}
您应该添加处理在ID列表中找不到图稿ID的情况。
请注意,每次对indexOf的调用都会对您的ID列表进行线性搜索,这使该解决方案在性能方面非常糟糕 :
每次对indexOf
调用都需要O(n)
(至少对于List
ArrayList
和LinkedList
实现而言)。 这意味着整个排序算法将采用O(n^2log(n))
而不是O(n log(n))
。
另一方面,按照我的建议创建地图并在ID列表中进行一次迭代将花费O(n)
。
也许可以帮到您,但是也许有更有效的算法可以做到这一点:
public static class RefListComparator implements Comparator<Artwork> {
List<Long> reflist;
RefListComparator(List<Long> reflist) {
this.reflist = reflist;
}
@Override
public int compare(Artwork o1, Artwork o2) {
for (long refid : reflist) {
if (o1.id == refid) {
return -1;
}
if (o2.id == refid) {
return 1;
}
}
return 0;
}
}
class MYComparator implements Comparator<Artwork> {
List<Long> artworkIds;
MYComparator (List<Long> artworkIds) {
this.artworkIds = artworkIds;
}
@Override
public int compare(Artwork o1, Artwork o2) {
int index1= artworkIds.indexOf(o1.getId());
int index2 = artworkIds.indexOf(o2.getId());
return (i1 < i2) ? -1 : ((i1 > i2) ? 1 : 0) ;
}
您可以按照以下方式使用ID实现Comparator进行排序
public class ArtWorksIdComparator implements Comparator<ArtWork>{
public int compare(ArtWork a1, ArtWork a2) {
return (a1.getId() < a2.getId() ) ? -1: (a1.getId() > a2.getId() ) ? 1:0 ;
}
}
为了了解Comparator和Comparable之间的区别,您可以在java geeks中查看此帖子。希望对您有所帮助
您可以在下面尝试。
Collections.sort(artworks, new Comparator<ArtWork>() {
public int compare(ArtWork left, ArtWork, right) {
return Integer.compare(artworkIds.indexOf(left.getId()), listA.indexOf(left.getId()));
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.