使用Collections.sort()找不到符号错误排序集合

时间:2014-01-28 19:31:44

标签: java collections arraylist

编辑:解决了!谢谢大家。

我正在尝试使用比较器在Java中对一个集合进行排序而没有运气。这是我的代码:

public class Collections_Exercise {

    public void runExercise(){

        String[] emailArray =  {"andy@test.com","paul@test.com","cindy@test.com", "robert@test.com", "bill@test.com", "andy@test.com", "cindy@test.com"};

        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());

6 个答案:

答案 0 :(得分:7)

Collections#sort需要List,而不是Collection

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

原因是有一些实现Collection的类无法任意重新排序。有些存储机制依赖于战略性放置的元素(例如HashSet),而其他存储机制则具有预定的排序顺序(例如TreeSet)。

Collection说了这个:

  

集合层次结构中的根接口。 ......有些是订购的,有些则是无序的。 JDK [only]提供了更具体的子接口的实现,如Set和List。通常使用此接口......需要最大的通用性。

因此,为什么你只在转换构造函数(the tutorial调用约定)和xxxAll方法族等地方看到Collection作为参数。

答案 1 :(得分:2)

在Java中,根据定义,类型Collection的容器没有顺序,因此无法排序。只能订购其子List

因此,Collections#sort方法期望类型为List的对象作为第一个参数,但是您提供了一个集合。

更改

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

List<String> emails = ...

答案 2 :(得分:1)

你错过了

}

在processEmails(电子邮件)之后;

你必须改变

Collection<String>

List<String>

答案 3 :(得分:1)

尝试更换:

原始

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

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

根据Java API Collections.sort接受List。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

Collections.sort()预计List不是Collection,请参阅here。因此,而不是

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

应该是

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