Java 按第三列的数值对二维字符串数组进行排序
Java sort 2D String Array by number value of third column
我得到了一个文本文件,其中包含滑冰选手的国家、姓名和分数。我必须将每一行读入一个数组,然后按降序对数组进行排序。
我设法像这样组织了一切:
infoArray[0][0] = "GER";
infoArray[0][1] = "Nathalie WEINZIERL Maylin & Daniel Peter LIEBERS Nelli & Alexander";
infoArray[0][2] = "17.0";
infoArray[1][0] = "RUS";
infoArray[1][1] = "Evgeny PLYUSHCHENKO Tatiana & Maxim Yulia LIPNITSKAYA Ekaterina & Dmitri"
infoArray[1][2] = "37.0";
infoArray[2][0] = "CHN";
infoArray[2][1] = "Kexin ZHANG Han YAN Cheng & Hao Xintong & Xun"
infoArray[2][2] = "20.0"
10 个不同的国家等等。
我现在需要的是使用第三列按降序显示 10 个不同的国家/地区,这是数值(尽管它是字符串格式)。
所以换句话说,我希望这三个国家的输出是:
RUS: 37.0
CHN: 20.0
GER: 17.0
我考虑过使用嵌套循环,但不太明白如何让它发挥作用。
我想我会做一个新的列表,只包含分数。然后对这个分数列表进行排序。然后用相关数组(包含国家、姓名、分数)替换分数
使用 Java 8,您可以 create a Comparator
使用相应的列作为比较的键,然后反转该比较器。这将对数组进行就地排序。
Arrays.sort(infoArray,
Comparator.comparing((String[] entry) -> Double.parseDouble(entry[2]))
.reversed());
或者对于旧版本的 Java,创建您自己的 Comparator 实现 compare
:
Arrays.sort(infoArray, new Comparator<String[]>() {
public int compare(String[] o1, String[] o2) {
return Double.compare(Double.parseDouble(o2[2]),
Double.parseDouble(o1[2]));
}
});
但是,如评论中所述,可能值得为这些信息项创建 class
并让 class 实施 Comparable
:
class Info implements Comparable<Info> {
String nation;
String names;
double score;
// more stuff ...
public int compareTo(Info other) {
return Double.compare(this.score, other.score);
}
}
然后这样排序:
Arrays.sort(infoArray, Comparator.reverseOrder());
您可以创建一个 class 并可以设置所有 fields.In 您的 case 3 字段将在那里,您可以实现 Comparable 并且在 compareTo 方法中您可以编写自己的逻辑,这将是取决于数值和书房,您可以使用 Collections 实用程序对其进行排序。
如果您不想实现 Comparable 接口,您可以编写自己的 Comparator class 并将其传递给 Collections 实用程序方法,该方法将根据您的逻辑进行排序。
如果有重复,请避免使用集合。
这是一个 XY Question,因为这不是 Java 中二维数组的正确用法。在 Java 中使用集合或 n 维数组时,该数据结构中的数据应始终属于同一类型(或至少在该类型的继承层次结构中)。
正如 Alexis C 在 his/her 评论中提到的那样:Java 是一种面向对象的语言,因此您应该使用 class 的对象来包含数据。然后您可以对该对象的特定字段的结构进行排序。
这是一个例子(我不太确定数组的不同组成部分实际代表什么:
class MyClass {
private string countryCode;
private string names;
private double score;
public MyClass() {
countryCode = null;
names = null;
score = 0d;
}
public string getCountryCode() { return this.countryCode; }
public void setCountryCode(string code) { this.countryCode = code; }
//repeat the above pattern for names & score
}
然后您可以创建一个对象并将数据添加到其中:
MyClass data = new MyClass();
data.setCountryCode("GER");
data.setNames("Nathalie WEINZIERL Maylin & Daniel Peter LIEBERS Nelli & Alexander");
data.setScore(17.0);
可以将此数据添加到集合(例如 ArrayList)中并进行排序。
List<MyClass> myDataCollection = new ArrayList<>();
myDataCollection.add(data);
//repeat for each object to populate the list
//sort the collection
Collections.sort(myDataCollection, Comparator.comparingDouble(s -> s.getScore()).reversed());
请记住,此示例适用于 Java8。这允许我们使用 lambda 表达式而不是创建显式比较器。
我得到了一个文本文件,其中包含滑冰选手的国家、姓名和分数。我必须将每一行读入一个数组,然后按降序对数组进行排序。
我设法像这样组织了一切:
infoArray[0][0] = "GER";
infoArray[0][1] = "Nathalie WEINZIERL Maylin & Daniel Peter LIEBERS Nelli & Alexander";
infoArray[0][2] = "17.0";
infoArray[1][0] = "RUS";
infoArray[1][1] = "Evgeny PLYUSHCHENKO Tatiana & Maxim Yulia LIPNITSKAYA Ekaterina & Dmitri"
infoArray[1][2] = "37.0";
infoArray[2][0] = "CHN";
infoArray[2][1] = "Kexin ZHANG Han YAN Cheng & Hao Xintong & Xun"
infoArray[2][2] = "20.0"
10 个不同的国家等等。
我现在需要的是使用第三列按降序显示 10 个不同的国家/地区,这是数值(尽管它是字符串格式)。
所以换句话说,我希望这三个国家的输出是:
RUS: 37.0
CHN: 20.0
GER: 17.0
我考虑过使用嵌套循环,但不太明白如何让它发挥作用。
我想我会做一个新的列表,只包含分数。然后对这个分数列表进行排序。然后用相关数组(包含国家、姓名、分数)替换分数
使用 Java 8,您可以 create a Comparator
使用相应的列作为比较的键,然后反转该比较器。这将对数组进行就地排序。
Arrays.sort(infoArray,
Comparator.comparing((String[] entry) -> Double.parseDouble(entry[2]))
.reversed());
或者对于旧版本的 Java,创建您自己的 Comparator 实现 compare
:
Arrays.sort(infoArray, new Comparator<String[]>() {
public int compare(String[] o1, String[] o2) {
return Double.compare(Double.parseDouble(o2[2]),
Double.parseDouble(o1[2]));
}
});
但是,如评论中所述,可能值得为这些信息项创建 class
并让 class 实施 Comparable
:
class Info implements Comparable<Info> {
String nation;
String names;
double score;
// more stuff ...
public int compareTo(Info other) {
return Double.compare(this.score, other.score);
}
}
然后这样排序:
Arrays.sort(infoArray, Comparator.reverseOrder());
您可以创建一个 class 并可以设置所有 fields.In 您的 case 3 字段将在那里,您可以实现 Comparable 并且在 compareTo 方法中您可以编写自己的逻辑,这将是取决于数值和书房,您可以使用 Collections 实用程序对其进行排序。
如果您不想实现 Comparable 接口,您可以编写自己的 Comparator class 并将其传递给 Collections 实用程序方法,该方法将根据您的逻辑进行排序。
如果有重复,请避免使用集合。
这是一个 XY Question,因为这不是 Java 中二维数组的正确用法。在 Java 中使用集合或 n 维数组时,该数据结构中的数据应始终属于同一类型(或至少在该类型的继承层次结构中)。
正如 Alexis C 在 his/her 评论中提到的那样:Java 是一种面向对象的语言,因此您应该使用 class 的对象来包含数据。然后您可以对该对象的特定字段的结构进行排序。
这是一个例子(我不太确定数组的不同组成部分实际代表什么:
class MyClass {
private string countryCode;
private string names;
private double score;
public MyClass() {
countryCode = null;
names = null;
score = 0d;
}
public string getCountryCode() { return this.countryCode; }
public void setCountryCode(string code) { this.countryCode = code; }
//repeat the above pattern for names & score
}
然后您可以创建一个对象并将数据添加到其中:
MyClass data = new MyClass();
data.setCountryCode("GER");
data.setNames("Nathalie WEINZIERL Maylin & Daniel Peter LIEBERS Nelli & Alexander");
data.setScore(17.0);
可以将此数据添加到集合(例如 ArrayList)中并进行排序。
List<MyClass> myDataCollection = new ArrayList<>();
myDataCollection.add(data);
//repeat for each object to populate the list
//sort the collection
Collections.sort(myDataCollection, Comparator.comparingDouble(s -> s.getScore()).reversed());
请记住,此示例适用于 Java8。这允许我们使用 lambda 表达式而不是创建显式比较器。