如何在java中对包含字符串,整数和字母数字的集合进行排序

有一些值,如AB,A012B,CD,1,10,01,9我必须排序他们的输出shud是01,1,9,10,A012B,AB,CD可以使用任何集合即时尝试使用集合.sortfunction,但它考虑到所有字符串和打印像01,1,10,9,A012B,AB,CD它不是我的要求…请帮助

//捕鱼技术

List values = new ArrayList(); values.add("AB"); values.add("A012B"); values.add("CD"); values.add("1"); values.add("10"); values.add("01"); values.add("9"); values.add("I"); Collections.sort(values, new Comparator() { @Override public int compare(String o1, String o2) { // TODO tweak the comparator here try{ Integer integer1 = Integer.valueOf(o1); Integer integer2 = Integer.valueOf(o2); return integer1.compareTo(integer2); }catch (java.lang.NumberFormatException e) { return o1.compareTo(o2); } } }); System.out.println(values); } 

//不够???

//这是鱼

 public static void main(String[] args) throws Exception { List values = new ArrayList(); values.add("AB"); values.add("A012B"); values.add("CD"); values.add("1"); values.add("10"); values.add("01"); values.add("9"); int maxLen = 0; for (String string : values) { if (string.length() > maxLen) { maxLen = string.length(); } } Collections.sort(values, new MyComparator(maxLen)); System.out.println(values); } public static class MyComparator implements Comparator { private int maxLen; private static final String REGEX = "[0-9]+"; public MyComparator(int maxLen) { this.maxLen = maxLen; } @Override public int compare(String obj1, String obj2) { String o1 = obj1; String o2 = obj2; // both numbers if (o1.matches("[1-9]+") && o2.matches("[1-9]+")) { Integer integer1 = Integer.valueOf(o1); Integer integer2 = Integer.valueOf(o2); return integer1.compareTo(integer2); } // both string if (o1.matches("[a-zA-Z]+") && o2.matches("[a-zA-Z]+")) { return o1.compareTo(o2); } Pattern p = Pattern.compile(REGEX); Matcher m1 = p.matcher(o1); Matcher m2 = p.matcher(o2); List list = new ArrayList(); while (m1.find()) { list.add(m1.group()); } for (String string : list) { o1.replaceFirst(string, leftPad(string, "0", maxLen)); } list.clear(); while (m2.find()) { list.add(m2.group()); } for (String string : list) { o2.replaceFirst(string, leftPad(string, "0", maxLen)); } return o1.compareTo(o2); } } public static String leftPad(String stringToPad, String padder, Integer size) { final StringBuilder strb = new StringBuilder(size.intValue()); final StringCharacterIterator sci = new StringCharacterIterator(padder); while (strb.length() < (size.intValue() - stringToPad.length())) { for (char ch = sci.first(); ch != CharacterIterator.DONE; ch = sci.next()) { if (strb.length() < (size.intValue() - stringToPad.length())) { strb.insert(strb.length(), String.valueOf(ch)); } } } return strb.append(stringToPad).toString(); } 

你应该实现一个比较器:

给定对象O1和对象O2:

你首先尝试将它们转换为数字并比较数字。

如果O1是数字而O2不是数字,则O2将被大于O1

如果O1不是数字且O2是数字,则认为O1大于O1

如果两者都不是数字,则将它们作为字符串进行比较。

你必须实现Comparator。 我假设您的所有数据都是字符串forms。 因此默认情况下,“10”出现在“9”之前。 您需要通过自己实现java.util.Comparator来解决这个问题。

首先你编写自己的Comparator ,然后调用Collections.sort(List, Comparator)

User952887的答案很棒,除了它仍然给出了0,01,1,10,11,2,21,3,4,5 ……等(通知10在1之后和2之前)。 请查看以下链接,获取一个很棒的字母数字比较器,它将返回0,1,2,3,4,5,10,11,21 http://sanjaal.com/java/tag/sample-alphanumeric-sorting/唯一问题是它将返回0,1,01-其中User952887的固定。