【问题标题】:Sorting on List using Comparator in Java在 Java 中使用 Comparator 对列表进行排序
【发布时间】:2013-10-31 13:57:34
【问题描述】:

我有两节课

public class PopularSports {    
    public int Rank;    
    public String Sport;
}

public class Medals {
    public String Sport    
    public String Medal    
    public int Year    
    public String Game    
    public String Athlete
}

当我尝试引导他们的 csv 并在每个班级的列表中获得结果时,我想按以下顺序对它们进行排序。

PopularSports 类应按以下顺序排序:

  1. 排名
  2. 运动

奖牌类应按以下顺序排序:

  1. 运动
  2. 奖牌
  3. 年份
  4. 游戏
  5. 运动员

我已经创建了这样的压实机

Collections.sort(medalReportList, new Comparator<Medals >() {
  @Override
  public int compare(Medals o1, Medals o2) {
   return getRankOfSportBySportName(o1.getSport()) > getRankOfSportBySportName(o2.getSport())
          ? +1
          : getRankOfSportBySportName(o1.getSport()) < getRankOfSportBySportName(o2.getSport())
          ? -1
          : o1.getAthlete().compareToIgnoreCase(o2.getAthlete());
    }
  });

但这并没有实现,它按运动员姓名排序。

【问题讨论】:

  • 好的希望你在排序第一个列表时没有问题??你想如何排序第二个......?即如果运动相同,则根据奖牌排序,如果奖牌根据比赛等排序......等等?这是你想要的吗??
  • 请包含一些您想要排序的数据。
  • 您的getRankOfSportBySportName 返回什么?你确定它工作正常吗?
  • @Jesper 函数返回运动的 int 等级
  • @jesper 谢谢你,是的,这个函数的行为很奇怪,因为 csv 阅读在阅读时也采取了 "

标签: java sorting comparator


【解决方案1】:

您需要嵌套这些检查。我会编写 PopularSports 方法,其他的留给你。

我建议您学习 Java 编码标准并将这些类名设为单数:PopularSportMedal。我将在下面演示:

public int compareTo(PopularSport other) {
    if (this.rank < other.rank) return -1;
    else if (this.rank > other.rank) return +1;
    else {
        // This is where the nesting happens to break the ties.
        if (this.sport.compareTo(other.sport) < 0) return -1;
        else if (this.sport.compareTo(other.sport) > 0) return +1;
        else return 0;  // You'll have deeper nesting for the other values in Medal.
    }
}

您选择的顺序决定了首先检查哪些。您嵌套在 else 子句中以打破联系。

【讨论】:

  • 让我试试这个然后回到你身边
【解决方案2】:

我会稍微简化你的逻辑。

public int compare(Medals o1, Medals o2) {
  int rankDifference = getRankOfSportBySportName(o1.getSport()) 
                             - getRankOfSportBySportName(o2.getSport());
  return rankDifference != 0 
      ? rankDifference
      : o1.getAthlete().compareToIgnoreCase(o2.getAthlete());
  }

【讨论】:

    【解决方案3】:

    其他人已经为您提供了三元运算符的解决方案。另一方面,我不鼓励您在复杂的情况下使用它 - 它根本不可读且难以维护。

    要么使用 if/else 块(如果要比较这么多字段,看起来会很糟糕),或者更好的是,使用第三方库。在Guava 中,您可以像这样使用ComparisionChain

    new Comparator<Medals>() {
        @Override
        public int compare(Medals m1, Medals m1) {
            return ComparisonChain.start()
             .compare(m1.getSport(), m2.getSport())
             .compare(m1.getMedal(), m2.getMedal())
             .compare(m1.getYear(), m2.getYear())
             .compare(m1.getGame(), m2.getGame())
             .compare(m1.getAthlete(), m2.getAthlete(), String.CASE_INSENSITIVE_ORDER)
             .result();
        }
    }
    

    这样不是更易读吗?!

    【讨论】:

      【解决方案4】:

      对第一个列表进行排序对您来说没有问题。如果你想排序,如果运动名称相同,则根据奖牌排序,如果奖牌名称相同,则根据年份排序,那么解决方案是:

      最好的方法:

      public void sortAccordingToAboveRequirement(List<Medal> medals){
      
       Collections.sort(medals,myComparator);
      
       }
      
      
        static Comparator<Medal> myComparator=new Comparator<Medal>() {
          @Override
              public int compare(Medal medal1, Medal medal2) {
              int value=0;
              value=medal1.getSport().compareTo(medal2.getSport());
              if(value!=0) return value;
              value=medal1.getMedal().compareTo(medal2.getMedal());
              if(value!=0) return value;
              value=medal1.getYear().compareTo(medal2.getYear());
              if(value!=0) return value;
              value=medal1.getGame().compareTo(medal2.getGame());
              if(value!=0) return value;
              value=medal1.getAthlete().compareTo(medal2.Athlete());
              return value;
          }
      };
      

      如果你愿意,可以使用 compareToIgnoreCase() :)

      【讨论】:

      • 呵呵呵呵我把你的问题弄错了,但是编码和提问的方式很差:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多