【问题标题】:Java comparator sort one entry out of orderJava比较器对一个条目进行无序排序
【发布时间】:2015-07-23 16:10:47
【问题描述】:

我正在按一列的值对二维数组进行排序。第一列是国家代码,第二列是那个国家的选手姓名,第三列是那个国家的分数:

skateArray[1][0] = "JPN";
skateArray[1][1] += "Yuzuru HANYU";
skateArray[1][2] = "13";

skateArray[2][0] = "USA";
skateArray[2][1] = "Jeremy ABBOTT "
skateArray[2][2] = "17";

我的工作方式是这样的:

     Arrays.sort(skateArray, new Comparator<String[]>() {

            public int compare(final String[] entry1, final String[] entry2)
            {

                final String firstScore = entry1[2];
                final String secondScore = entry2[2];
                return secondScore.compareTo(firstScore);


            }
        });

        for (final String[] string : skateArray) {
            System.out.println(string[0] + " " + string[1] + " " + string[2]);
        }

除了输出中的这个怪癖之外,一切正常:

GBR   8.0
RUS  37.0
CAN  32.0
USA   27.0
JPN   24.0
ITA   23.0
CHN  20.0
FRA  20.0
GER  17.0
UKR   10.0

如您所见,首先显示得分最低的国家(GBR,8.0)。其余的按我想要的降序显示。我不知道为什么。

【问题讨论】:

  • 您尝试按数字排序,但您的值表示为字符串。 “10”和“2”哪个更大?
  • 考虑创建一个带有类型属性的 POJO,而不是使用应该被解释为非字符串的字符串数组。

标签: java arrays sorting


【解决方案1】:

这是因为您将分数作为字符串进行比较,所以它们是按字母顺序排序的。

尝试用以下代码替换函数的最后一行:

return new Double(secondScore).compareTo(new Double(score1));

【讨论】:

  • 使用 parseValue 或 valueOf 减少创建的对象数量。
【解决方案2】:

您将每个分数条目解析为字符串。从这个意义上说,8(字符)总是在1(字符)之后,所以结果应该不足为奇。

我强烈建议将分数解析为浮点数或整数并以这种方式进行比较。那么你应该得到你想要的结果。

【讨论】:

    【解决方案3】:

    正如其他人所说,这是因为您将分数存储为 String 而不是数字类型。

    考虑使用面向对象编程,并创建一个Skater 类。这将允许您将 Skater 的每个成员(变量)存储在其正确的数据类型中。在这种情况下,分数应表示为doubleint,您的排序功能将正常工作。

    class Skater {
        String country;
        String name;
        double score;
        public Skater(String country, String name, double score){
            this.country = country;
            this.name = name;
            this.score = score;
        }
    
        @Override public String toString() { return country + " " + name + " " + score; }
    }
    

    然后进行排序:

    Skater[] skaters = {
        new Skater("JPN", "Yuzuru HANYU", 13), 
        new Skater("USA", "Jeremy ABBOTT", 17)
    }
    
    Arrays.sort(skaters, new Comparator<Skater>(){
        @Override int compare(Skater s1, Skater s2){
            return Double.compare(s1.score, s2.score);
        }
    }
    
    for(Skater skater : skaters) {
        System.out.println(skater);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多