我正在处理2D数组,我需要组织我的数组。说明,我的数组是一个数组字符串,它在标题中包含一些双精度值,我想在标题的函数中对该数组进行排序。
我想的第一件事是获取头部并对头部进行排序,将数组中的所有列放入另一个数组中,并将排序的头部的值与每个列索引进行比较,然后推送到另一个数组中。
然而,我认为有一种方法可以很容易地做到这一点,但我不知道是否有这种方法,我看到了直接在数组中排序并在函数中进行组织的可能性,但我不知道如何做到这一点。
以防万一:
Original array
String[][]myArray = {{3,Toto,30},{2,Tata,29},{1,Titi,13}};
Array expected
String[][]newArray = {{1,Titi,13},{2,Tata,29},{3,Toto,30}};
开放提案!谢谢。
编辑:标题可以是双精度值。
发布于 2018-10-13 05:53:43
如果我没理解错的话,看起来是这样的:
Arrays.stream(myArray)
.sorted(Comparator.comparingDouble(x -> Double.valueOf(x[0])))
.toArray(String[][]::new);
当然,您也可以通过Arrays::sort
和Comparator
就地执行此操作
发布于 2018-10-13 06:30:31
当我尝试之前的答案时,它只是返回了原始数组。以下是对我有效的方法:
String[][] myArray = {{"3","Toto","30"},{"2","Tata","29"},{"1","Titi","13"}};
Arrays.sort(myArray, new Comparator<String[]>() {
public int compare(String[] lhs, String[] rhs) {
try {
double lhs_value = Double.parseDouble(lhs[0]);
double rhs_value = Double.parseDouble(rhs[0]);
if (lhs_value < rhs_value) return -1;
if (lhs_value > rhs_value) return 1;
return 0; //else the two are equal
} catch (NumberFormatException e) {
//handle exception
return 0;
}
}
});
我的输出:
1 Titi 13
2 Tata 29
3 Toto 30
在这里,Arrays.sort
(see Javadoc)接受两个参数:一个要排序的数组(myArray)和一个Comparator
(see Javadoc),后者是一个允许在两个任意类型之间进行比较的接口。由于{"3", "Toto", "30"}
不是您创建的类型,而只是一个String[]
,因此我们将创建一个内联Comparator<String[]>
。
比较器实现了一个函数"compare“,它接受两个元素,并返回-1、0或1来确定元素的顺序。本质上,"compare“在排序过程中被多次调用,以精确地确定排序顺序。下面是一些伪代码:
public int compare(Object a, Object b)
if (a comes "before" b) return -1
if (a is "equal" to b) return 0
if (a comes "after" b) return 1
如果还不清楚,您可以在这里了解更多关于比较器接口的信息:https://www.geeksforgeeks.org/comparator-interface-java/
我知道我之前用了“之前”和“之后”,这有点模糊和不严谨。如果您更喜欢数学,这里有一个关于比较器接口的很好的讨论:https://math.stackexchange.com/questions/1400655/java-comparator-documentation-confused-about-the-terminology-total-order
https://stackoverflow.com/questions/52787162
复制相似问题