2017-03-11 50 views
3

我正在傳入一個ArrayList來填充Android中TabLayout的標題。數組中的元素是字符串:["RCP", "RYL", "1", "2", "3", "4", "5", "6"].但是,不一定按此順序。在數字之前用字母排序Java ArrayList

我想列表返回與Letter元素首先(按字母順序),然​​後整數上升,增量。

我已經使用Collections.sort方法試過,但這個上升數值返回一個列表,然後將最後的「R」的字符串:["1", "2", "3", "4", "5", "6", "RCP", "RYL"]

爲了澄清,我想整理我的ArrayList,使其返回["RCP", "RYL", "1", "2", "3", "4", "5", "6"]它還需要靈活,因爲「R」字符串的標題可能會改變。

感謝

+3

自定義比較可能的工作匿名內部類。 – duffymo

+0

整數是否也可能改變?可能在某個時間點有2位或更多位的數字,並希望結果中的「10」之前出現「9」? –

+0

整數可能會以字符串值作爲後綴。即'[「1AB」,「1AV」]'。然後需要先按照字符串前綴的順序打印,然後再打印數字前綴,例如'[「RCA」,「RLM」,「1EP」,「1FT」,「2LJ」,「2MO」]等等。我還沒有檢查過這個... – dantan04

回答

2

如果要優先考慮字符串中不包含字符串的字符串,則應考慮編寫自己的Comparator並將其傳遞給Collections.sort方法。

這是一個解決問題的簡單方法:檢查是否有任何字符串是數字,如果是,則優先考慮不是數字的字符串。如果兩者都是數字或字符串,請使用字符串的compareTo方法。

希望它有幫助。

public class Main { 

    private static int customCompare(String a, String b) { 
     return isThereAnyNumber(a, b) 
       ? isNumber(a) ? 1 : -1 
       : a.compareTo(b); 
    } 

    private static boolean isThereAnyNumber(String a, String b) { 
     return isNumber(a) || isNumber(b); 
    } 

    private static boolean isNumber(String s) { 
     return s.matches("[-+]?\\d*\\.?\\d+"); 
    } 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); 
     Collections.sort(list, Main::customCompare); 
     System.out.println(list); 
    } 
} 

UPDATE

您可以使用的情況下,實現了Comparator接口你不使用Java 8

public class Main { 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); 
     Collections.sort(list, new Comparator<String>() { 
      private boolean isThereAnyNumber(String a, String b) { 
       return isNumber(a) || isNumber(b); 
      } 

      private boolean isNumber(String s) { 
       return s.matches("[-+]?\\d*\\.?\\d+"); 
      } 

      @Override 
      public int compare(String a, String b) { 
       return isThereAnyNumber(a, b) 
         ? isNumber(a) ? 1 : -1 
         : a.compareTo(b); 
      } 
     }); 
     System.out.println(list); 
    } 
} 
+0

感謝您的努力。我不能在Android中調用'Collections.sort(list,Main :: customCompare);',但它會拋出:「此語言級別不支持方法引用」。有任何想法嗎? – dantan04

+0

@ dantan04我提供了一個新的解決方案,如果您不使用Java 8或Android,則不會使用lambda表達式,但我不支持使用某些東西(如方法引用)。希望它現在可以工作。 – acontell

+0

這有助於很多!我創建了這個通過: '收藏。排序(列表中,新的比較(){ @覆蓋 公衆詮釋比較(一個String,字符串T1){ customCompare(S,T1); 返回0;} });' 它返回列表:'[「6」,「5」,「4」,「3」,「2」,「1」,「R」]'我只是需要現在逆轉,有沒有一種方法呢? – dantan04

4

沒有爲Collections.sort一個重載將在一個Comparator,這將允許你定義排序順序爲您的項目。在這種情況下,你所要做的就是定義你自己實現的Comparator接口,它可以隨心所欲。

+0

謝謝,我現在正在閱讀'Comparator'文檔。 (我目前正在從一本好書學習android,所以它穩步前進)。 – dantan04