2011-09-27 24 views
1

字符串,整數和字母數字的集合還有像AB,A012B,CD,1,10,01,9 一些值我要排序的THEM 輸出shud是 01, 1,9,10,A012B,AB,CD 可以使用任何集合 我嘗試使用collection.sort功能 但考慮一切,串 和打印一樣01,1,10,9,A012B,AB,CD 它不是我的REQ ......請幫助如何排序具有在java中

回答

3

//捕撈技術

List<String> values = new ArrayList<String>(); 
    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<String>() { 

     @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<String> values = new ArrayList<String>(); 
    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<String> { 
    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<String> list = new ArrayList<String>(); 
     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(); 
} 
+0

我認爲,除了「I」之前我想要「01」以外,一切都很好。任何想法,我們如何能夠實現這一目標?輸出爲1,01,9,A01B,AB,CD –

+0

我編輯了答案是否符合你的目的? – user952887

+0

非常感謝..我真的很感謝你的努力 –

1

你應該實現一個比較:

給出的OBJ ECT O1和目標O2:

你第一次嘗試將它們CONVER數字和比較數字。

如果O1是數字和O2不是,那麼O2比O1

被conisdered更大

如果O1是不是數字和O2是數字,那麼O1是要超過01

如果更多考慮兩者都不是數字,你把它們比作字符串。

0

首先,你寫你自己的Comparator然後調用Collections.sort(List, Comparator)

1

您必須實現比較。我假設你所有的數據都是以字符串的形式出現的。因此默認「10」在「9」之前。你需要通過自己實現java.util.Comparator來解決這個問題。

0

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的固定。