繁体   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