![](/img/trans.png)
[英]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.