2 回答

TA贡献1876条经验 获得超7个赞
您可以使用这样的比较器:
public final static Comparator<String> STANDARD_ALPHABETICAL_ORDER =
(a,b) -> {
int na = a.length();
int nb = b.length();
int r;
int n;
if (na < nb) {
r = -1;
n = na;
} else if (na > nb) {
r = -1;
n = nb;
} else {
r = 0;
n = na;
}
for (int i = 0; i < n; ++i) {
char ca = a.charAt(i);
char cb = b.charAt(i);
if (ca != cb) {
if (Character.isDigit(ca) && !Character.isDigit(cb)) {
return 1;
} else if (!Character.isDigit(ca) && Character.isDigit(cb)) {
return -1;
} else if (ca < cb) {
return -1;
} else {
return 1;
}
}
}
return r;
};
然后用它对你的数组进行排序:
String[] words = { "2012010", "2012012", "2012011", "201201A" };
Arrays.sort(words, STANDARD_ALPHABETICAL_ORDER);
System.out.println("In lexicographical order:");
for (int i = 0; i < 4; i++) {
System.out.println(words[i]);
}

TA贡献1811条经验 获得超5个赞
你可以这样编码
包装测试;
导入 java.util.Arrays;导入 java.util.Comparator;
公共类 AlphabeticalSort {
public static void main(String args[]) throws NoSuchFieldException,
SecurityException {
String[] words = { "2012010", "2012012", "2012011", "2012011A","2012011B" };
Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int result=0;
if (isNumber(o1) && isNumber(o2)) {
result= Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
} else if (!isNumber(o1) && isNumber(o2)) {
Integer o1num = Integer.valueOf(o1.replaceAll("[^-?0-9]+",
""));
if (o1num == Integer.valueOf(o2)) {
result= -1;
} else {
result= o1num.compareTo(Integer.valueOf(o2));
}
} else if (!isNumber(o2) && isNumber(o1)) {
Integer o1num = Integer.valueOf(o2.replaceAll("[^-?0-9]+",
""));
if (o1num == Integer.valueOf(o1)) {
result= +1;
} else {
result= o1num.compareTo(Integer.valueOf(o1));
}
} else {
result= o1.compareTo(o2);
}
System.out.println("o1="+o1+" o2="+o2+" result= "+result);
return result;
}
});
System.out.println("In lexicographical order:");
for (int i = 0; i < words.length; i++) {
System.out.println(words[i]);
}
}
public static boolean isNumber(String val) {
boolean isNumber = false;
try {
Integer.parseInt(val);
isNumber = true;
} catch (NumberFormatException e) {
// e.printStackTrace();
}
return isNumber;
}
}
添加回答
举报