[英]passing comparator to collections.sort() in Java?
我有以下代碼,我有一個Treeset,如果我通過我的比較器,它工作正常。 但是,如果我構造我的Treeset然后調用collections.sort,我會得到編譯錯誤。 我的代碼在這里
import java.util.*;
public class ComparatorExample {
private static class SbufferComparator implements Comparator<StringBuffer> {
@Override
public int compare(StringBuffer s1, StringBuffer s2) {
return s1.toString().compareTo(s2.toString());
}
}
public static void main(String[] args) {
StringBuffer one = new StringBuffer("one");
StringBuffer two = new StringBuffer("two");
StringBuffer three = new StringBuffer("three");
Set<StringBuffer> sb=new TreeSet<StringBuffer>();
//The below line works
//Set<StringBuffer> sb=new TreeSet<StringBuffer>(new SbufferComparator());
sb.add(one);
sb.add(two);
sb.add(three);
System.out.println("set before change: "+ sb);
//This does not work
Collections.sort(sb, new SbufferComparator());
System.out.println("set After change: "+ sb);
}
}
PS。 我知道StringBuffer
是一個bad
類型,可以作為Set中的元素保留。 但是,我正在測試Java是否允許在Set中保留一個可變對象。 (python不允許將可變對象放在集合或字典中(map))
Collections.sort()
只能應用於List
,並且您正在傳遞一個Set
因此它失敗(它根本不應該編譯)。
TreeSet
是一個有序Set
,因此您應該使用適當的Comparator
創建它,並且該集合的內容將始終排序,而無需手動對其進行排序。
Collections.sort
需要List
而不是Set
。 試試這個
Set<StringBuffer> sb=new TreeSet<StringBuffer>(new SbufferComparator());
並刪除完全sort
的調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.