2010-08-31 20 views
3

由於問題說我有這個問題。我知道它爲什麼在開始時,因爲它是1和0,所以它在排序之前甚至是9。但是,它可以按照sort()列表的正確順序排列嗎?爲什麼在排序後的ArrayList開始10)

+5

你的問題沒有意義。也許你可以添加一些代碼?我有一個預感你正在排序字符串 – 2010-08-31 17:25:56

+5

你正在尋找一個「自然排序」。這裏有一個前面的問題與答案:http://stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-one-built-in – 2010-08-31 17:26:42

+3

也許你正在排序'字符串'而不是'Numbers'? – Kevin 2010-08-31 17:27:06

回答

12

您需要更改列表以包含數字(例如,Integer s或Double s)而不是字符串。

+4

也許他需要有字符串。如果是這樣,他應該使用自然的分類 – 2010-08-31 17:36:17

0

如果你字符串進行排序而不是數字,這個代碼可以幫助你理解上的差異:

ArrayList stringList = new ArrayList(); 
    stringList.add("9"); 
    stringList.add("10"); 
    Collections.sort(stringList); 
    Assert.assertEquals("10", stringList.get(0)); 

    ArrayList integerList = new ArrayList(); 
    integerList.add(9); 
    integerList.add(10); 
    Collections.sort(integerList); 
    Assert.assertEquals(9, integerList.get(0)); 

使用JUnit斷言斷言。

0

正如其他人所說,如果你打算分類實際的數字不存儲他們的字符串。如果您確實想自然地對包含數字的字符串進行排序,我更喜歡使用Apache Commons Collection Utils ComparatorUtils.NATURAL_COMPARATOR,不過還有其他選項具有不同的可配置性和功能。

0

Java本身不支持按照您需要的方式自然排序String對象。關於此請參見Java Trail。主要原因是由於許多不同的語言等原因,這樣做太複雜了。因此,以前有關將List<String>更改爲List<Integer>List<Double>的答案可能是一個更好的主意。

但是,Stackoverflow上的this question可能對您有所幫助。

3

如果列表中必須的String S表示某種原因(似乎不太可能對我來說),(使用Guava)一個選項是:

List<String> numbers = ...; 
Collections.sort(numbers, Ordering.natural().onResultOf(
    new Function<String, Integer>() { 
     public Integer apply(String from) { 
     return Integer.valueOf(from); 
     } 
    })); 

此基礎上每個整數值排序字符串列表字符串表示。如果不是每個字符串都可以被解析爲整數,則會拋出異常。

1

一個建議:

您可以實現Comparator<String>支持排序算法,如果你需要堅持字符串,並且不希望使用數字或等價類。這樣您可以根據需要對元素進行排序。

0

我無法理解它,因爲我正在創建整數而不是字符串,但它不起作用。

但是後來我在代碼中看到了一個小錯誤,我忘記了Integer.parseint(String)被註釋掉了。

無論如何,答案的傢伙有幫助,並加載其他方法來解決這個問題。

+0

Kasper,你應該編輯你的問題來提及這個問題,或者將它添加爲對問題的評論,因爲這不是一個真正的答案。 – ColinD 2010-08-31 20:09:37

0

序列的字典順序。