2017-03-17 63 views
2

我是編程的初學者,我有兩個類。第一類是:如何重寫compareTo(Java)

public class User implements Comparable<User> 

與現場int age,構造函數和接口可比的overrided方法:

@Override 
    public int compareTo(User user) { 
     return user.age >= age ? -1 : 0; 
    } 

第二類是 public class SortUser與從列表中進行設置收集方法:

public Set<User> sort(List<User> list) { 
     Set<User> result = new TreeSet<>(); 
     for (User user : list) { 
      result.add(user); 
     } 
     return result; 
    } 

在我看來,Set中的所有User對象都應該排序,但是當我做出List機智H 3 User對象...

User a = new User(1); 
User b = new User(2); 
User c = new User(3); 
List<User> list = new ArrayList<>(); 
list.add(c); 
list.add(a); 
list.add(b); 

(現在列表的順序爲:312) ...創造從列表中選擇一個SetTreeSet):

SortUser sortUser = new SortUser(); 
Set<User> set = sortUser.sort(list); 

最後我有一個set與該訂單:13,這意味着set中只有兩個對象。出了什麼問題?

+3

我不會將它添加到一組排序。只需在列表中調用'sort'即可。 – Carcigenicate

+1

你不能有一個排序集。集合是無序集合。 sort()方法需要對List(或其他有序集合)進行排序,或返回List。 – chrisdowney

+1

@chrisdowney那麼,從技術上說,你*可以*有一個有序的集合。您只需確保具體的實現支持它。它非常有可能編寫一個有序集合實現。 – Carcigenicate

回答

5

正如我看到你有錯誤的比較方法的執行。你能更新它嗎?

@Override 
public int compareTo(User user) { 
    return Integer.compare(age, user.age); 
} 
1

你在做什麼TreeSet是不必要的。我不確定它們在迭代時保證有特定的順序。

只是

Collections.sort(list)

而我的猜測,爲什麼被丟棄的元素是你compareTo方法從不返回在任何情況下1,所以元素通常被認爲是不太取代你的排序方法大於或等於其他元素,這可能是與TreeSet擰緊。

0

User類

public class User implements Comparable<User>{ 
    int age; 
    User(int age){age=age;} 
    @Override 
    public int compareTo(User user) { 
    return this.age >= age ? -1 : 0; 
    } 
} 

準備清單

User a = new User(1); 
    User b = new User(2); 
    User c = new User(3); 
    List<User> list = new ArrayList<>(); 
    list.add(c); 
    list.add(a); 
    list.add(b); 

排序

Set<User> list1 = new TreeSet(list); 
1

請按照下面的方法

在字符串的情況下。

public static Comparator<Employee> NameComparator = new Comparator<Employee>() { 
    @Override 
    public int compare(Employee e1, Employee e2) { 
     return e1.getName().compareTo(e2.getName()); 
    } 
}; 

在整數的情況下,值

public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() { 

    @Override 
    public int compare(Employee e1, Employee e2) { 
     return (int) (e1.getSalary() - e2.getSalary()); 
    } 
}; 
+0

這不是一個好方法,當有一個論點的可能性是負面的。但是,在薪水的情況下,我想有些支票不會讓薪水變成負值。 – bpjoshi