【问题标题】:Sort a list of objects, based on values, taken from another class根据取自另一个类的值对对象列表进行排序
【发布时间】:2021-01-11 10:35:23
【问题描述】:

我有一个“类别”类的对象列表:

    public class Category {
    
        private String originalId;
        private Double ordinal;
        private String sportId;
        private String sportName;
        private String type;
        private String version;
}

以及“联赛”类的对象列表:

public class League {

    private String leagueName;
    private String originalId;
    private int rank;

    public League(String name, String originalId, int rank) {
        this.leagueName = name;
        this.originalId = originalId;
        this.rank = rank;
    }

这些类描述的是相同的实体(因此“Category”类的“originalId”字段值等于“League”类的“originalId”字段值),但它们的值来自不同的来源,这就是为什么它们从一开始就分开了

我需要做的是按“联赛”类中的“排名”字段值对“类别”列表进行排序

所以,排序的逻辑应该如下:

  1. 对于每个“Category”对象,我会尝试通过比较它们的“originalId”字段来找到对应的“League”对象

  2. 如果找到相应的对象,则从“联赛”对象中获取“排名”字段的值,并使用它按排名对“类别”对象列表进行排序

  3. 如果没有找到对应的对象,那么在排序过程中应该将这样的“类别”对象移动到列表的末尾

所以,比较器应该是这样的:

public static Comparator<Category> byRank() {
        return nullsLast(comparing(Category::getRankFromCorrespondingLeagueObject, nullsLast(naturalOrder())));
    }

这就是我难过的地方,因为我在排序时使用取自另一个对象的字段值是不寻常的

有一些简单的好方法吗?

【问题讨论】:

    标签: java sorting comparator


    【解决方案1】:

    创建一个由originalId 排列的League 地图,将其提供给您的比较器并使用它。如果您在地图中找不到任何内容,请设置使用 Integer.MIN_VALUE(或 MAX_VALUE,具体取决于您想要订购的方式)。这将命令它到结果的末尾。类似的东西(有点伪代码):

    public static Comparator<Category> byRank(Map<String, Integer> leagueRanks) {
        return new Comparator<Category>() {
          @Override
          public int compare(Category o1, Category o2) {
            return Integer.compare(leagueRanks.getOrDefault(o1.getOriginalId(), Integer.MAX_VALUE), leagueRanks.getOrDefault(o2.getOriginalId(), Integer.MAX_VALUE));
          }
        };
    }
    

    要收集League 等级来映射你可以使用这样的东西:

    Map<String, Integer> leagueRanks = leagues.stream().collect(Collectors.toMap(it -> it.getOriginalId(), it -> it.getRank()));
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多