二维数组按指定的列排序问题
写一个 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];
}
});
}