Java按第三列的数值排序2D字符串数组

时间:2015-07-23 14:25:46

标签: java arrays string sorting comparator

我给出了一个包含国家,名字和滑冰竞争对手分数的文本文件。我必须将每一行读入一个数组,然后按降序对数组进行排序。

我设法让所有事情都像这样:

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

我考虑过使用嵌套循环,但我不能完全掌握如何使用它。

4 个答案:

答案 0 :(得分:2)

使用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并让该类实现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());

答案 1 :(得分:2)

您可以创建一个类并可以设置所有字段。在您的情况下,3个字段将在那里,您可以实现Comparable,在compareTo方法中,您可以编写自己的逻辑,这将依赖于数值和您可以使用Collections实用程序对其进行排序。

如果您不想实现Comparable接口,您可以编写自己的Comparator类并将其传递给Collections实用程序方法,该方法将根据您的逻辑进行排序。

如果您有重复项,请避免使用set集合。

答案 2 :(得分:1)

这是XY Question,因为这不是Java中2D阵列的正确用法。在Java中使用集合或n维数组时,该数据结构中的数据应始终具有相同的类型(或至少在该类型的继承层次结构中)。

正如Alexis C在他/她的评论中提到的:Java是面向对象的语言,因此您应该使用类的对象来包含数据。然后,您可以对该对象的特定字段上的结构进行排序。

这是一个例子(我不确定数组的不同组件实际代表什么:

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());

请记住,此示例适用于Java 8.这允许我们使用lambda表达式而不是创建显式比较器。

答案 3 :(得分:0)

我想我会创建一个新列表,只包含分数。然后对此分数列表进行排序然后用相关数组(包含国家,名称,分数)替换分数