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个属性时间、名称等。我尝试了这个,但我的应用程序强制关闭,并认为这导致了关闭。现在我修复了这个错误,它工作了,谢谢大家!我尝试了一下,但我的应用程序强制关闭,并认为这导致了关闭。现在我修复了这个错误,它工作了,谢谢大家!