解题思路:要保证89,8这种谁大,首先需要比较第一位的两个8,显然一样大,继续比较89的第二位9和8谁大,显然9更大,这样组合就是898,而不是889。可以抽象成A1,A2,...,Am。
对于A1和A2,A1放在前面的条件是第一位大于A2第一位,如果等于,则继续比较,例如89 87 ,第二位9大于第二位的8,满足条件,以此类推,但是对于89 8这种,比较第一位是相等的,接下来比较第二位,但是8只有一位,这个时候就需要对此长度取模让第一位8能够和另一个数的9比较,显然8小于9。89放在8前面就是898
下面是代码实现:
package com.cc;
public class A implements Comparable<A> {
public int[] value;
public A(int num) {
String str = String.valueOf(num);
value = new int[str.length()];
for (int i = 0; i < str.length(); i++) {
value[i] = str.charAt(i) - 48;
}
}
@Override
public int compareTo(A obj) {
int o[] = obj.value;
int[] max;
int[] min;
boolean flag;
if (o.length < value.length) {
max = value;
min = o;
flag = false;
} else {
max = o;
min = value;
flag = true;
}
int i = 0;
int j;
while (i < max.length) {
j = i >= min.length ? i % min.length : i;
if (min[j] > max[i]) {
return flag ? -1 : 1;
} else if (min[j] == max[i]) {
i++;
continue;
} else if (min[j] < max[i]) {
return flag ? 1 : -1;
}
}
return 0;
}
@Override
public String toString() {
String str = "";
for (int a : value) {
str += a;
}
return str;
}
}
package com.cc;
import java.util.Arrays;
public class Main {
int a;
public static void main(String[] args) {
int[] mArr = {97,89};
A[] objArr = new A[mArr.length];
for (int i = 0; i < mArr.length; i++) {
objArr[i] = new A(mArr[i]);
}
Arrays.sort(objArr);
for (A a : objArr) {
System.out.println(a);
}
}
}
如上代码有个flag,因为不确认比较的值是否比当前值长,所以会做个交换,这种交换会导致排序错误,所以用flag来纠正结果