Java比较器:对一个条目进行排序时出现了错误。

4

我正在按照一列的值对2D数组进行排序。第一列保存国家代码,第二列保存该国家滑冰选手的姓名,第三列保存该国家的得分:

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)被首先显示。其余国家按我想要的降序排列。我不知道为什么。


2
你正在尝试进行数字排序,但是你的值被表示为字符串。"10"和"2"哪个更大? - Oliver Charlesworth
2
考虑创建一个具有类型属性的POJO,而不是使用应被解释为非字符串的字符串数组。 - Puce
3个回答

6

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

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

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

1
使用parseValue或valueOf来减少创建的对象数量。 - Puce

3
你正在将每个分数条目解析为字符串。在这个意义上,8(字符)始终在1(字符)之后,因此结果不应引起惊讶。
我强烈建议将分数解析为浮点数或整数,并以这种方式进行比较。然后你应该得到想要的结果。

2

正如其他人所说,这是因为你将分数存储为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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接