编辑:解决了!谢谢大家。
我正在尝试使用比较器在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());
答案 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);