2014-01-28 25 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);