2012-07-31 70 views
0

說我有一個字符串數組:需要通過字符串的一部分字符串進行排序

String[] array = { 
    "2183417234 somerandomtexthere", 
    "1234123656 somemorerandomtexthere", 
    "1093241066 andevenmore", 
    "1243981234 you get what i mean", 
    //etc 

}; 

將如何使用長(這是一個漫長)在字符串的開始我有點這個數組,所以它「會成爲看起來是這樣的:

String[] array = { 
    "1093241066 andevenmore", 
    "1234123656 somemorerandomtexthere", 
    "1243981234 you get what i mean", 
    "2183417234 somerandomtexthere", 
    //etc 

}; 

我試着從使它成爲一個ArrayList和使用集合#排序,以創建我自己的比較,使用一個有序圖/樹狀圖everyting,我只是不能想辦法。 謝謝。

+4

安置自己的比較,以便我們能夠解決它 – dantuch 2012-07-31 21:32:52

+1

你絕對應該使用自定義比較。 – 2012-07-31 21:33:07

+1

裏面的比較器可能會拆分字符串,只是比較長的值 – kosa 2012-07-31 21:33:17

回答

2

使用此功能:

static long comparedValue(String s) { 
    return Long.valueOf(s.substring(0, s.indexOf(' '))); 
} 

,然後定義在它的一個方面比較:

public int compare(String left, String right) { 
    return comparedValue(left) - comparedValue(right); 
} 
+0

如果沒有在那裏投射,這將無法正常工作。此外,如果發生溢出,則通過減去「long」值進行比較可能會導致錯誤的結果。 – 2012-07-31 22:41:10

1

使用Google Guava

List<String> unsorted = Arrays.asList(array); 

Function<String, Long> longFunction = new Function<String, Long>() { 
    @Override public Long apply(String input) { 
    return Long.valueOf(input.split(" ")[0]); 
    } 
}; 

List<String> sorted = Ordering.natural().onResultOf(longFunction).immutableSortedCopy(unsorted); 

或者,如果你不想使用列表(你應該總是喜歡集合到陣列):

Arrays.sort(array, Ordering.natural().onResultOf(longFunction)); 
0

您顯示的輸入工作得很好。但那是因爲他們都有相同的數字位數。

public static void main(String[] args) { 
    String[] array = { "2183417234 somerandomtexthere", 
      "1234123656 somemorerandomtexthere", "1093241066 andevenmore", 
      "1243981234 you get what i mean", "999 little shorter" 
    // etc 

    }; 

    List<String> list = Arrays.asList(array); 
    Collections.sort(list); 

    System.out.println(list); 
} 

問題開始出現時,當你使用一些短號碼 - 如上圖所示999 ...

輸出將是:

[1093241066 andevenmore, 1234123656 somemorerandomtexthere, 1243981234 you get what i mean, 2183417234 somerandomtexthere, 999 little shorter]

所以,使其工作永諾 - 你需要你的自定義比較器,它將能夠分割給定的字符串,然後將數字部分從它們中分離出來並進行比較。使用@Marko Topolik解決方案:

static long comparedValue(String s) { 
    return Long.valueOf(s.substring(0, s.indexOf(' '))); 
} 

public int compare(String left, String right) { 

    long result = comparedValue(left) - comparedValue(right); 

    boolean numberPartAreEqual = result == 0; 
    if (numberPartAreEqual) { 
     result = left.compareTo(right); 
    } 

    return (int) result; 
} 
0

自定義比較應該很好地工作:

public class LongPrefixComparator implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2) { 
     final long pref1 = getPrefixValue(s1); 
     final long pref2 = getPrefixValue(s2); 
     return s1 == s2 ? 0 : s1 < s2 ? -1 : 1; 
    } 

    private static long getPrefixValue(String stg) { 
     int len = stg.indexOf(' '); 
     if (len > 0) { 
      try { 
       return Long.parseLong(stg.substring(0, len)); 
      catch (NumberFormatException ignored) {} 
     } 
     return 0L; 
    } 
} 
相關問題