2014-01-28 30 views
1

編輯:已解決!謝謝大家。找不到符號錯誤排序Collection with Collections.sort()

我想在沒有運氣的情況下使用比較器在Java中對Java集合進行排序。這裏是我的代碼:

public class Collections_Exercise { 

    public void runExercise(){ 

     String[] emailArray = {"[email protected]","[email protected]","[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"}; 

     Collection<String>emails = new ArrayList<String>(Arrays.asList(emailArray));  
     processEmails(emails); 

     // 5. Call processEmails with a sorted list of emails with duplicate email addresses removed 
     System.out.println("Sorted list of emails with no dups!"); 

     class alphabeticalComparator implements Comparator<String> 
     { 
      @Override 
      public int compare(String email1, String email2) 
      { 
       int result = email1.toString().compareTo(email2.toString()); 
       return result; 
      } 
     } 

     Collections.sort(emails, new alphabeticalComparator()); //Doesn't work, can't find collections.sort() symbol 
     processEmails(emails); 

     private void processEmails(Collection<String> emails) 
     { 
       for(String s : emails) 
         System.out.println(s); 
     } 



     public static void main(String [] args) 
     { 
       new Collections_Exercise().runExercise(); 
     } 
} 

無論我嘗試什麼,我都無法讓Collections.sort()工作。有小費嗎?

編輯:這是一個終端是給我的錯誤:

Collections_Exercise.java:58: cannot find symbol 
symbol : method sort(java.util.Collection<java.lang.String>,alphabeticalComparator) 
location: class java.util.Collections 
Collections.sort(emails, new alphabeticalComparator()); 
+0

請告訴我們你的意思到底是什麼,當你說:「我不能讓Collections.sort()」什麼是確切的問題 –

+0

有你嘗試移動你的比較級以外的方法? – JustinKSU

+1

字符串的自然排序是按字母順序排列的。調用Collections.sort()而不傳入比較器並查看是否有效。 – JustinKSU

回答

7

Collections#sort需要List,而不是一個Collection

List<String> emails = new ArrayList<String>(Arrays.asList(emailArray)); 

這樣做的原因是,有實現的集合,不能隨意重新排序一些類。有些存儲機制取決於策略性地放置元素(如HashSet),而其他存儲機制具有預定的排序順序(如TreeSet)。

Collection說,這一下:

Collection層次結構中的根接口。 ...有些是有序的,有些是無序的。 JDK [only]提供了更多特定子接口的實現,比如Set和List。這個接口通常用於需要最大通用性的場合。

因此,爲什麼你只看到收藏在像轉換構造地方參數(the tutorial調用約定)和xxxAll方法的家庭。

+0

你是對的,但是另一個問題是他錯過了我寫的,有2個問題;) – Alessio

+1

這個修正了它!非常感謝。 upvoted,並會在4分鐘內接受答案,當我可以。 – Ladybro

+0

@Alessio這是真的,但這可能只是一個複製和粘貼錯誤。 – Radiodef

1

你錯過了

} 

後processEmails(電子郵件);

,你必須改變從

Collection<String> 

List<String> 
1

嘗試更換:

原始

Collection<String>emails = new ArrayList<String>(Arrays.asList(emailArray)); 

ListString>emails = new ArrayList<String>(Arrays.asList(emailArray)); 

根據Java API Collections.sort接受List。

2

在Java中,根據定義,Collection類型的容器沒有順序,因此無法排序。只有子女List可以訂購。

因此,Collections#sort方法需要List類型的對象作爲第一個參數,但是您提供了一個Collection。

變化

Collection<String> emails = new ArrayList<String>(Arrays.asList(emailArray)); 

List<String> emails = ... 
1
List<String> emails = Arrays.asList(emailArray); 
Collections.sort(emails, new alphabeticalComparator()); 
1

Collections.sort()需要一個List不是Collection,看到here。因此,不是

Collection<String>emails = new ArrayList<String>(Arrays.asList(emailArray));  

應該

final List<String>emails = Arrays.asList(emailArray);