日期:2014-05-20  浏览次数:20833 次

二维数组按指定的列排序问题
写一个 Java 程序,实现对一个规则二维数组按 指定的列 进行排序?
  a为二维数组,sortCols是要按第几列排序,sortord 用于指定排序方式 
  你可以约定 true 为升序,false 为降序 
  必要的时候可以补充其它方法,然后在 sortIntArrays 中调用 
  要求排序后,不能破坏原有的数据结构! 
  如 { 12, 34, 68, 32, 9, 12, 545 } 不论排到了第几个,这个小数组中的数据是不能变化的 
  换言之就是根据某个数排序,比如 34 ,该小数组的其他的数据跟着一起变动 
   
  public void sortIntArrays( int[][] a , String sortCols , boolean sortord ) 
  {
  //补充代码
  }
   
  int array[][] = new int[][] {  
  { 12, 34, 68, 32, 9, 12, 545 },  
  { 34, 72, 82, 57, 56, 0, 213 },  
  { 12, 34, 68, 32, 21, 945, 23 },  
  { 91, 10, 3, 2354, 73, 34, 18 },  
  { 12, 83, 189, 26, 27, 98, 33 },  
  { 47, 23, 889, 24, 899, 23, 657 },  
  { 12, 34, 68, 343, 878, 235, 768 },  
  { 12, 34, 98, 56, 78, 12, 546 },  
  { 26, 78, 2365, 78, 34, 256, 873 }  
  };  
  对于以上数组,按照最后一列排序(升序)后的结果为:
  { 91, 10, 3, 2354, 73, 34, 18 }
  { 12, 34, 68, 32, 21, 945, 23 }
  { 12, 83, 189, 26, 27, 98, 33 }
  { 34, 72, 82, 57, 56, 0, 213 }
  { 12, 34, 68, 32, 9, 12, 545 }
  { 12, 34, 98, 56, 78, 12, 546 }
  { 47, 23, 889, 24, 899, 23, 657 }
  { 12, 34, 68, 343, 878, 235, 768 }
  { 26, 78, 2365, 78, 34, 256, 873 }



------解决方案--------------------
根据楼主的代码自己写了下

import java.util.*;

public class xuanzhe {

public static void main(String[] args) {

Map<String,int[]> m = new HashMap<String,int[]>();
int array[][] = new int[][] { { 12, 34, 68, 32, 9, 12, 545 },
{ 34, 72, 82, 57, 56, 0, 213 },
{ 12, 34, 68, 32, 21, 945, 23 },
{ 91, 10, 3, 2354, 73, 34, 18 },
{ 12, 83, 189, 26, 27, 98, 33 },
{ 47, 23, 889, 24, 899, 23, 657 },
{ 12, 34, 68, 343, 878, 235, 768 },
{ 12, 34, 98, 56, 78, 12, 546 },
{ 26, 78, 2365, 78, 34, 256, 873 } };
int[] a = new int[array.length];
for (int n = 0; n < array.length; n++) {
a[n] = array[n][array[n].length - 1];
m.put(a[n]+"", array[n]);
}
xuanzheSort(a,m);
}

public static void xuanzheSort(int[] a,Map<String,int[]> m) {

for (int i = 0; i < a.length; i++) {
int temp = a[i];
for (int j = i + 1; j < a.length; j++) {
int swap = a[j];
if (temp > a[j]) {
a[i] = swap;
a[j] = temp;
temp = swap;
}
}
int[] d=m.get(temp+"");
for(int k=0;k<d.length;k++){
System.out.print(d[k]+" ");

}
System.out.println();
}
}
}

结果自己发现了问题啊
输出数组时为[I@de6ced
想了一下感觉没什么办法能直接输出数组的 所以只能for循环了
看了楼主的代码也是for写的 不知道有什么办法能直接搞出数组
代码楼主可以参考下
------解决方案--------------------
Java code

//= =
    public static void main(String[] args) {
        int array[][] = new int[][]{
            {12, 34, 68, 32, 9, 12, 545},
            {34, 72, 82, 57, 56, 0, 213},
            {12, 34, 68, 32, 21, 945, 23},
            {91, 10, 3, 2354, 73, 34, 18},
            {12, 83, 189, 26, 27, 98, 33},
            {47, 23, 889, 24, 899, 23, 657},
            {12, 34, 68, 343, 878, 235, 768},
            {12, 34, 98, 56, 78, 12, 546},
            {26, 78, 2365, 78, 34, 256, 873}
        };
        sortIntArrays(array, 6, true);
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public static void sortIntArrays(int[][] array, final int sortCols, final boolean sortord) {
         java.util.Arrays.sort(array,new java.util.Comparator() {

            @Override
            public int compare(Object o1, Object o2) {
                //长度没sortCols长的排前面
                if(o1==null&&o2==null)
                    return 0;
                if(o1==null&&o2!=null)
                    return sortord?1:-1;
                if(o1!=null&&o2==null)
                    return sortord?-1:1;
                int[]st1=(int[]) o1;
                int[]st2=(int[]) o2;
                if(st1.length<sortCols&&st2.length<sortCols)
                    return 0;
                if(st1.length<sortCols&&st2.length>=sortCols)
                    return sortord?1:-1;
                if(st1.length>=sortCols&&st2.length<sortCols)
                    return sortord?-1:1;
                //如果二个长度都足够
                return sortord?st1[sortCols]-st2[sortCols]:st2[sortCols]-st1[sortCols];
            }
        });
    }