写一个 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 }
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 }
package javaoop;
import java.util.Arrays;public class TestPaiXun2Wei { 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 }
};
PaiXun2Wei a =new PaiXun2Wei();
a.sortIntArrays(array, "0", true);
}}class PaiXun2Wei {
// 主方法
public void sortIntArrays(int[][] a, String sortCols, boolean sortord) {
if (sortord == true) {// 升序
this.up(a, sortCols);
} else if (sortord == false) {// 降序
this.down(a, sortCols);
}
}
// 上升排序(由小到大)
public void up(int[][] a, String sortCols) {
int[][]aa={};//用来存放排序后的a[][]
int[] b = {};// 存放需要排序列的数组
int[] c ={};// 存放b[]升序后的数组
int[] z = {};// 存放排序后数组元素原来所在数组的下标
for (int i = 0; i < 9; i++) {//提取需要排序的一列存到b[]
b[i] = a[i][Integer.parseInt(sortCols)];
}
for(int i=0;i<b.length;i++){//复制b[]
c[i]=b[i];
}
Arrays.sort(c);// 升序排列 为了得到排序后元素 排序前的下标z[]
for (int i = 0;i<c.length; i++) {
for (int j = 0;j<c.length; j++) {
if (c[i] == b[j]) {
z[i] = j;
b[j] =-999999;
break;
} else {
continue;
}
}
}
for(int i=0;i<a.length;i++){//建立aa[][]存放排序后的a[][] 并打印
for(int j=0;j<a[0].length;j++){
aa[i][j]=a[z[i]][j];//利用z[]下标数组排序
System.out.print(aa[i][j]+"\t");
}
System.out.println();
}
} // 下降排序(由大到小)
public void down(int[][] a, String sortCols) {
int[][]aa={};
int[] z = {};// 存放排序后数组元素原来所在数组的下标
int[] b = {};// 存放需要排序列的数组
int[] d ={};// 存放b[]升序后的数组
int[] c ={};// 存放b[]降序后的数组
for (int i = 0; i < 9; i++) {
b[i] = a[i][Integer.parseInt(sortCols)];
}
for(int i=0;i<b.length;i++){
d[i]=b[i];
}
Arrays.sort(d);// 升序排列
for (int i = 0,j = c.length - 1; i < c.length; i++,j--) {// 升序变降序
c[i]=d[j];
}
for (int i = 0;i<c.length; i++) {
for (int j = 0;j<c.length; j++) {
if (c[i] == b[j]) {
z[i] = j;
b[j] =-999999;
break;
} else {
continue;
}
}
}
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++){
aa[i][j]=a[z[i]][j];
System.out.print(aa[i][j]+"\t");
}
System.out.println();
}
}}
这是我写的 报错哦!新手求帮忙!
java.lang.UnsupportedClassVersionError:javaoop/TestPaiXun2Wei : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Exception in thread "main"
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写的 不知道有什么办法能直接搞出数组
代码楼主可以参考下
//= =
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];
}
});
}