我有这个多维数组:
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”。
答案 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])));