2012-09-28 30 views
5

我需要根據字符串的長度對LinkedList的字符串進行排序,但是想要保持長度相同的字符串的順序(不按字典順序排序)。如何對LinkedList進行排序<String>?

樣品輸入:

this 
is 
just 
a 
test 

樣本輸出:

a 
is 
this 
just 
test 

我試圖用一個Comparable<LinkedList<String>>compareTo方法來做到這一點,但我沒有得到正確的輸出(我仍然按字典順序排序)

public class Q3_sorting implements Comparable<LinkedList<String>> { 
    Scanner keyboardScanner = null; 
    LinkedList<String> fileList = new LinkedList<String>(); 

// [...]一些代碼這裏

public int compareTo(LinkedList<String> o) { 
     // TODO Auto-generated method stub 
     o = fileList; 

     for (int i = 0; i < fileList.size() -1; i++) { 
      if (fileList.get(i).length() == o.get(i+1).length()) { 
       return 0; 
      } 
      if (fileList.get(i).length() > o.get(i+1).length()) { 
       return -1; 
      } 
      if (fileList.get(i).length() < o.get(i+1).length()) { 
       return 1; 
      } 

     } 

然後我在我的主要方法使用
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); 。然後,我將清單打印出來...

,但我得到這個作爲輸出:

a 
is 
just 
test 
this 

我怎麼會糾正這個問題?

回答

3

您正在排序字符串,而不是字符串列表。要做到這一點,你需要定義一個Comparator<String>通過它們的長度兩個字符串比較如下:

public class ByLength implements Comparator<String> { 
    @Override 
    public int compare(String a, String b) { 
    return a.length() - b.length(); 
    } 
} 

然後,對列表進行排序,你需要調用:

Collections.sort(sort.fileList, new ByLength()); 

還要注意的是排序LinkedList效率非常低,您應該改用ArrayList

+0

「Collections.sort」的任何合理實現都會在排序之前將數據複製到數組中,然後再次複製。但是,「LinkedList」通常效率低下,通常應避免使用。 –

-1

不幸的是,字符串沒有表示它們在鏈接列表中保留的位置的屬性。因此,您需要創建一個自定義數據對象,以便跟蹤該信息。要麼是這樣,要麼爲鏈接列表編寫自己的自定義排序方法,並調用它來代替Collections.sort()。

6

使用Collections.sort(list, comparator)過載。你需要一個Comparator<String>而不是一個Comparator<LinkedList<String>>。請注意,Collections.sort的javadoc保證了穩定的排序(保持相同字符串的順序,根據比較器等同等於平均值​​)。

+0

啊,好的。我是多麼愚蠢......謝謝 – user1706571

7

你應該建立一個比較:

Collections.sort(list, new Q3_sorting()); 

請注意,你想要做的是什麼樣的表內字符串:

public class Q3_sorting implements Comparator<String> { 
public int compare(String a, String b) { 
return a.length() - b.length(); 
} 

然後用該方法來排序。通過實現List的比較器(或者可比較的,因爲它在這裏用於相同的目的)你告訴JVM的是你想要比較不同的List。

你也可以通過在類中實現一個Comparable來實現你的目標來排序,但是你不能只要String是final的,所以你不能擴展。因此,除了實現比較器之外,沒有別的辦法,這也比較簡單:)

+0

'Comparator'也可以用來排序'List'實現,比如'TreeSet'和'TreeMap'。 – Brian

+0

是的。它也可以用於對數組進行排序,通過Arrays實用程序類來定製用途。 – enTropy

相關問題