如何在java中用整数值中的一列对多维字符串数组进行排序?

时间:2016-07-04 19:49:32

标签: java arrays sorting multidimensional-array

我有这个多维数组:

  

String [] [] array = new String [10] [2];

在第一列中,我有字符串,在我的情况下是用户名,但在第二列中,我有字符串,应该表示整数。现在我想按如下方式对数组进行排序:

Before:

Petter 543
John   276
Jay    1879
Alf    5021
etc.

After:

Alf    5021
Jay    1879
Petter 543
John   276
etc.

所以我希望顶部的最高值和底部的最低值,但不要弄乱名字。到目前为止,我发现的是如何排序所有整数多维数组或只是字符串多维数组,而不是如何只基于整数排序第二列。

我曾经对它进行了排序,但它以“字母”方式排序:

所以1000分是最高分 12分是第二高分 999999是最低分。

如1表示“a”,9表示“z”。

6 个答案:

答案 0 :(得分:3)

如果 id 以某种方式关联,那么最好创建一个模拟它们的类( POJO ),使 POJO 可比较,定义 列表 > POJO 并使用Collections#sort按照所需标准排序......

另外要考虑的是你有一个2维的String数组 String [] [] ,但您的问题是

  

...如何在java中的 整数值中按一列对多维字符串数组进行排序?

这意味着您需要考虑将字符串解析为整数...(就像一个很好的提示)

public class MyPojo implement Comparator<MyPojo>{

private String name;

private String id;
...implements the method of the comparator 

}

主测试类中的do

List<MyPojo> mList = new ArrayList<MyPojo>();
mList.add(...);
mList.add(...);
mList.add(...);



Collections.sort(mList);
System.out.println(mList)

答案 1 :(得分:3)

使用Java 8流:

String[][] out = Arrays.stream(names)
    .sorted(Comparator.comparing(x -> -Integer.parseInt(x[1])))
    .toArray(String[][]::new);

答案 2 :(得分:2)

我的建议是获取2D数组的第二列,并将其放在自己的整数数组中。然后,在该阵列上调用Arrays.sort()。最后,将新排序的数组作为字符串值放回2D数组中。这是它应该是什么样子,

int arr = new int[10];
String[][] copy = new String[10][2];
for(int i = 0; i < array.length; i++){
    arr[i] = Integer.parseInt(array[i][1]);
    System.arraycopy(array[i], 0, copy[i], 0, array[i].length);
}
Arrays.sort(arr);
for(int i = 0; i < array.length; i++){
    array[i][1] = String.valueOf(arr[i]);
}

//fixing the names
for(int i = 0; i < copy.length; i++){
    for(int j = 0; j < array.length; j++){
        if(copy[i][1] == array[j][1]){
             array[j][0] = copy[i][0];
             break;
        }
    }
}

编辑:为了解决名称的顺序,我更改了代码以包含2D数组的副本,以便在按顺序重写整数值之后,进行检查以查看每个整数移动了。对于每个整数,相应的名称将转移到整数移动的位置。

答案 3 :(得分:2)

循环遍历数组,直到它排序并且每次都不交换。

public static void main(String[] args) {
    String[][] array = new String[4][2];
    array[0][0] = "Petter"; array[0][1] = "543";
    array[1][0] = "John";   array[1][1] = "276";
    array[2][0] = "Jay";    array[2][1] = "1879";
    array[3][0] = "Alf";    array[3][1] = "5021";

    System.out.println(Arrays.deepToString(array)); // [[Petter, 543], [John, 276], [Jay, 1879], [Alf, 5021]]

    sortArrayByScore(array);

    System.out.println(Arrays.deepToString(array)); // [[Alf, 5021], [Jay, 1879], [Petter, 543], [John, 276]]
}

public static void sortArrayByScore(String[][] array) {
    String tmpName, tmpScore;
    boolean sorted = false;

    while (!sorted) {
        sorted = true;
        for (int i = 0 ; i < array.length - 1 ; i++) {
            if (Integer.parseInt(array[i][1]) < Integer.parseInt(array[i+1][1])){
                sorted = false;
                // SWAP NAMES
                tmpName = array[i][0];
                array[i][0] = array[i+1][0];
                array[i+1][0] = tmpName;

                // SWAP SCORES
                tmpScore = array[i][1];
                array[i][1] = array[i+1][1];
                array[i+1][1] = tmpScore;
            }
        }
    }

}

答案 4 :(得分:1)

使用比较器对数组中的项目进行排序。在您的情况下,您有一个数组数组,因此您需要一个数组的比较器。您可以使用String数组的比较器,该数组假定第二项是值。

public class SomeComparator implements Comparator<String[]> {
    /**
     * Assumes each row is length 2 and the 2nd String is really a number.
     */
    @Override
    public int compare(String[] row1, String[] row2) {
        int value1 = Integer.parseInt(row1[1]);
        int value2 = Integer.parseInt(row2[1]);
        // compare value2 first to sort descending (high to low)
        return Integer.compare(value2, value1);
    }
}

然后你可以像这样使用Arrays.sort进行排序

String[][] data = newData(); // or however you get your data
Arrays.sort(data, new SomeComparator());

答案 5 :(得分:0)

您可以使用比较器对第二个元素的Integer值上的内部String []项进行排序,而不是使用默认的字符串排序:

public String lastKey() {
    if (tm instanceof TreeMap<?, ?>) {
        return ((TreeMap<String, SortedSet>) tm).lastKey();
    } else {
        // Error!
    }
}

在这里,您使用lambda语法执行与以下操作相同的操作:

Arrays.sort(array, (o1, o2) -> Integer.valueOf(o2[1]).compareTo(Integer.valueOf(o1[1])));