Java排序数组
我知道如何对具有两列的数组进行排序:Java排序数组,java,arrays,sorting,Java,Arrays,Sorting,我知道如何对具有两列的数组进行排序: Arrays.sort(myarray, new Comparator<String[]>() { @Override public int compare(String[] entry1, String[] entry2) { String time1 = entry1[0];
Arrays.sort(myarray, new Comparator<String[]>() {
@Override
public int compare(String[] entry1, String[] entry2) {
String time1 = entry1[0];
String time2 = entry2[0];
return time2.compareTo(time1);
}
});
等等。。
我想按第二列或第四列对其进行排序。。。
我可以尝试通过创建一个新数组[1st+3rd+4th column][2nd column]来解决这个问题,然后使用上述解决方案对其进行排序,然后将元素分开,但这太间接了。您必须遍历这两个数组,直到找到元素不同的索引并返回该索引处字符串的比较。这与比较字符串时使用的基本相同
for(int i=0;i<Math.min(entry1.length,entry2.length);i++){
String x=entry1[i], y=entry2[i];
int diff=x.compareTo(y);
if (diff!=0) return diff;
}
if (entry1.length==entry2.length) return 0;
else return entry1.length-entry2.length;
上面的代码还处理数组可能不具有相同列数的情况。您必须遍历两个数组,直到找到元素不同的索引并返回该索引处字符串的比较。这与比较字符串时使用的基本相同
for(int i=0;i<Math.min(entry1.length,entry2.length);i++){
String x=entry1[i], y=entry2[i];
int diff=x.compareTo(y);
if (diff!=0) return diff;
}
if (entry1.length==entry2.length) return 0;
else return entry1.length-entry2.length;
上面的代码还处理数组可能不具有相同列数的情况。要按不同列排序,只需替换这些行中的[0]:
String time1 = entry1[0];
String time2 = entry2[0];
如果要按多列排序,首先需要按最高顺序首选项进行比较,例如:
String time1 = entry1[0];
String time2 = entry2[0];
int cmp = time2.compareTo(time1);
然后,如果结果为零,即它们相等,则通过下一个最高偏好进行比较:
if (cmp == 0) {
String s1 = entry1[1];
String s2 = entry2[1];
cmp = s2.compareTo(s1);
}
return cmp;
要按其他列排序,只需替换这些行中的[0]:
String time1 = entry1[0];
String time2 = entry2[0];
如果要按多列排序,首先需要按最高顺序首选项进行比较,例如:
String time1 = entry1[0];
String time2 = entry2[0];
int cmp = time2.compareTo(time1);
然后,如果结果为零,即它们相等,则通过下一个最高偏好进行比较:
if (cmp == 0) {
String s1 = entry1[1];
String s2 = entry2[1];
cmp = s2.compareTo(s1);
}
return cmp;
这与使用两列是一样的,但是使用更多的列:只要比较器检查所关心的列,就可以根据需要对任意多或任意少的列进行排序 要按多列排序,需要确定比较顺序,并在列不相等时立即返回比较结果
切题地说,为什么要使用数组呢?它是Java,也可以像对象一样使用。这与两列相同,但有更多的列:只要比较器检查您关心的列,您可以根据需要对任意多或任意少的列进行排序 要按多列排序,需要确定比较顺序,并在列不相等时立即返回比较结果 切题地说,为什么要使用数组呢?它是Java,可以像对象或其他东西一样使用。下面是一个示例:
public static class ColumnComparator<T extends Comparable>
implements Comparator<T[]> {
private int column;
public ColumnComparator(int column) {
this.column = column;
}
public int compare(T[] o1, T[] o2) {
return o1[column].compareTo(o2[column]);
}
}
这样使用:
Arrays.sort(myarray, new ColumnComparator<String>(1));
可以很容易地概括为比较多个列。以下是一个示例:
public static class ColumnComparator<T extends Comparable>
implements Comparator<T[]> {
private int column;
public ColumnComparator(int column) {
this.column = column;
}
public int compare(T[] o1, T[] o2) {
return o1[column].compareTo(o2[column]);
}
}
这样使用:
Arrays.sort(myarray, new ColumnComparator<String>(1));
比较多个列很容易推广。我认为最简单的方法是使用一个临时字符串数组,因为您有一个字符串数组- 示例阵列:
String array[][][] = {
{
{"Hello", "World"},
{"Apple", "Orange"}
},
{
{"Zebra", "Cow"},
{"Cat", "Ball"}
},
{
{"Elephant", "Whale"},
{"Lion", "Monkey"}
}
};
字符串的临时数组:
String[] tempArray = new String[array.length * array[0].length * array[0][0].length];
填充临时数组:
int tempIndex = 0;
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
for(int k=0; k<array[i][j].length; k++) {
System.out.println("array[" + i + "][" + j + "][" + k + "]: " + array[i][j][k]);
tempArray[tempIndex++] = array[i][j][k];
}
}
}
用排序后的值填充原始数组-
tempIndex = 0;
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
for(int k=0; k<array[i][j].length; k++) {
array[i][j][k] = tempArray[tempIndex++];
}
}
}
现在,如果再次打印原始数组的元素,它应该会打印-
array[0][0][0]: Apple
array[0][0][1]: Ball
array[0][1][0]: Cat
array[0][1][1]: Cow
array[1][0][0]: Elephant
array[1][0][1]: Hello
array[1][1][0]: Lion
array[1][1][1]: Monkey
array[2][0][0]: Orange
array[2][0][1]: Whale
array[2][1][0]: World
array[2][1][1]: Zebra
我认为最简单的方法是使用一个临时字符串数组,因为您有一个字符串数组- 示例阵列:
String array[][][] = {
{
{"Hello", "World"},
{"Apple", "Orange"}
},
{
{"Zebra", "Cow"},
{"Cat", "Ball"}
},
{
{"Elephant", "Whale"},
{"Lion", "Monkey"}
}
};
字符串的临时数组:
String[] tempArray = new String[array.length * array[0].length * array[0][0].length];
填充临时数组:
int tempIndex = 0;
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
for(int k=0; k<array[i][j].length; k++) {
System.out.println("array[" + i + "][" + j + "][" + k + "]: " + array[i][j][k]);
tempArray[tempIndex++] = array[i][j][k];
}
}
}
用排序后的值填充原始数组-
tempIndex = 0;
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
for(int k=0; k<array[i][j].length; k++) {
array[i][j][k] = tempArray[tempIndex++];
}
}
}
现在,如果再次打印原始数组的元素,它应该会打印-
array[0][0][0]: Apple
array[0][0][1]: Ball
array[0][1][0]: Cat
array[0][1][1]: Cow
array[1][0][0]: Elephant
array[1][0][1]: Hello
array[1][1][0]: Lion
array[1][1][1]: Monkey
array[2][0][0]: Orange
array[2][0][1]: Whale
array[2][1][0]: World
array[2][1][1]: Zebra
有什么问题吗?条目[0]是第一列,条目[1]是第二列,条目[2]是第三列,依此类推。只需比较entry1[3]和entry2[3]就可以比较第四列。你应该把数据放在一个合适的对象中,而不是字符串数组中。你应该真正使用对象。数组应该是一个对象数组,每个对象有4个属性时间、名称等。有什么问题?条目[0]是第一列,条目[1]是第二列,条目[2]是第三列,依此类推。只需比较entry1[3]和entry2[3]就可以比较第四列。你应该把数据放在一个合适的对象中,而不是字符串数组中。你应该真正使用对象。数组应该是一个对象数组,每个对象有4个属性时间、名称等。我尝试了这个,但我的应用程序强制关闭,并认为这导致了关闭。现在我修复了这个错误,它工作了,谢谢大家!我尝试了一下,但我的应用程序强制关闭,并认为这导致了关闭。现在我修复了这个错误,它工作了,谢谢大家!