[英]using Natural order with treeset in java
我得到了一個意想不到的輸出。 請看一看。 我無法找到問題所在。 我的計划有什么問題? 誰能解釋一下? 我得到了輸出
Joe Sue Mike Clare Juliet
Joe Mike Clare Juliet
TreeSets
和TreeMaps
對象以及使用Comparable
Interface的Collections.sort()
Lists
。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
class Person implements Comparable<Person> {
private String name;
public Person(String name) {
this.name = name;
}
public String toString() {
return name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Person person) {
int len1 = name.length();
int len2 = person.name.length();
if(len1 > len2) {
return 1;
}
else if(len1 < len2) {
return -1;
}
else {
return 0;
}
}
}
public class App {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
SortedSet<Person> set = new TreeSet<Person>();
//adding Element
addElements(list);
addElements(set);
//sorting element
Collections.sort(list);
//displaying result
showElements(list);
System.out.println();
showElements(set);
}
//adding element methods
private static void addElements(Collection<Person> col) {
col.add(new Person("Joe"));
col.add(new Person("Sue"));
col.add(new Person("Juliet"));
col.add(new Person("Clare"));
col.add(new Person("Mike"));
}
private static void showElements(Collection<Person> col) {
for(Person element: col) {
System.out.println(element);
}
}
}
您是按照姓名的長度來比較這些人。 名稱“Joe”和“Sue”具有相同的長度。 因此,TreeSet中只能出現其中一個。 但是,這個比較標准與 equals
的實現不一致 !
您應該將Person
對象放入列表中,並使用Collections#sort
對此列表進行Collections#sort
- 最好使用自己的Comparator
。 另請參閱https://stackoverflow.com/a/21659849
編輯:進一步解釋:
Set
只能包含每個元素一次 。 通過指定compareTo
方法的方式,您實現了“Sue”和“Joe”相等(因為它們的名稱長度相等)。 所以它們不能同時出現在Set
。
注意:基於equals
方法,它們並不equals
。 但是TreeSet
使用了compareTo
方法,而這個compareTo
方法目前與equals
不一致。 因此,由於您的compareTo
方法錯誤, Set
顯示錯誤的行為。
編輯:一個可能的解決方案:
如果名稱長度相等,則可以按字母順序進行比較。 這樣, compareTo
方法與equals一致 :當且僅當名稱相等時,它將返回0。
@Override
public int compareTo(Person person) {
int len1 = name.length();
int len2 = person.name.length();
if(len1 > len2) {
return 1;
}
else if(len1 < len2) {
return -1;
}
else {
return name.compareTo(person.name);
}
}
如果可以將元素添加到Set,則SortedSet
使用compareTo進行評估。 您的輸入包含兩個具有相同長度的名稱(您的比較標准),因此必須過濾掉Joe或Sue中的一個(在您的情況下為Sue)。
TreeSet文檔討論了(非強制)compareTo實現與equals一致的實現。 在你的情況下,'Joe'和'Sue'的長度相等,根據你的compareTo實現,它們是相同的。 一種解決方法是比較compareTo方法中的哈希碼值,如果它們的長度相等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.