我按一列的值对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)。其余的按照我想要的降序显示。我无法弄清楚为什么。
答案 0 :(得分:6)
这是因为您将分数作为字符串进行比较,因此它们按字母顺序排序。
尝试用以下方法替换函数的最后一行:
return new Double(secondScore).compareTo(new Double(score1));
答案 1 :(得分:3)
您将每个得分条目解析为字符串。从这个意义上说,8
(角色)总是在1
(角色)之后,因此结果不应该令人惊讶。
我强烈建议将分数解析为浮点数或整数,然后按这种方式进行比较。然后你应该得到你想要的结果。
答案 2 :(得分:2)
正如其他人所说,这是因为您将分数存储为String
而非数字类型。
考虑使用面向对象的编程,并创建一个Skater
类。这将允许您以适当的数据类型存储Skater的每个成员(变量)。在这种情况下,分数应表示为double
或int
,您的排序功能将正常运行。
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);
}