簡體   English   中英

如何使用Java Comparator接口參考具有ID的另一個列表對對象列表進行排序

[英]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 ArrayListLinkedList實現而言)。 這意味着整個排序算法將采用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM