HashSet supprime les doublons mais TreeSet ne l'est pas?
Sortie de ci-dessous de la classe est :
la taille est de 3
la taille est de 1
Mais si je change le TreeSet à un HashSet ligne :
Set<SuggestionDetailBean> set = new TreeSet<SuggestionDetailBean>();
devient
Set<SuggestionDetailBean> set = new HashSet<SuggestionDetailBean>();
la sortie est :
la taille est de 3
la taille est de 2
Crier à l'aide HashSet ou TreeSet pas modifier la taille de l'Ensemble ?
À l'aide de HashSet semble se comporter comme prévu parce que c'est en supprimant les doublons, mais lorsque j'utilise TreeSet les doublons rester ?
Je pense que le hashcode et equals méthodes de SuggestionDetailBean sont redéfinies correctement ?
Voici le code :
public class TestSet {
public static void main(String args[]){
SuggestionDetailBean s = new SuggestionDetailBean();
s.setTagList("teddst");
s.setUrl("testurl");
SuggestionDetailBean s2 = new SuggestionDetailBean();
s2.setTagList("teddst");
s2.setUrl("testurl");
SuggestionDetailBean s3 = new SuggestionDetailBean();
s3.setTagList("tessdafat");
s3.setUrl("fdfaasdfredtestur ldd");
List<SuggestionDetailBean> list = new ArrayList<SuggestionDetailBean>();
list.add(s);
list.add(s2);
list.add(s3);
Set<SuggestionDetailBean> set = new TreeSet<SuggestionDetailBean>();
set.addAll(list);
System.out.println("size is "+list.size());
System.out.println("size is "+set.size());
}
}
public class SuggestionDetailBean implements Comparable<Object> {
private String url;
private String tagList;
private String numberOfRecommendations;
private String date;
private String time;
private String summary;
private String truncatedUrl;
public void setTruncatedUrl(String truncatedUrl) {
if(truncatedUrl.length() > 20){
truncatedUrl = truncatedUrl.substring(0, 20)+"...";
}
this.truncatedUrl = truncatedUrl;
}
public String getSummary() {
if(summary == null){
return "";
}
else {
return summary;
}
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTime() {
return time;
}
public String getTruncatedUrl() {
return this.truncatedUrl;
}
public void setTime(String time) {
this.time = time;
}
public String getTagList() {
if(tagList == null){
return "";
}
else {
return tagList;
}
}
public void setTagList(String tagList) {
this.tagList = tagList;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getNumberOfRecommendations() {
return numberOfRecommendations;
}
public void setNumberOfRecommendations(String numberOfRecommendations) {
this.numberOfRecommendations = numberOfRecommendations;
}
@Override
public int compareTo(Object o) {
DateFormat formatter;
Date date1 = null;
Date date2 = null;
SuggestionDetailBean other = (SuggestionDetailBean) o;
if(this.date == null || other.date == null){
return 0;
}
formatter = new SimpleDateFormat(SimpleDateFormatEnum.DATE.getSdfType()+" "+SimpleDateFormatEnum.TIME.getSdfType());
try {
date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(other.date + " " + other.time);
} catch (ParseException e) {
System.out.println("Exception thrown in"+this.getClass().getName()+", compareTo method");
e.printStackTrace();
}
catch(NullPointerException npe){
System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
}
return date2.compareTo(date1);
}
@Override
public int hashCode() {
return this.url.hashCode();
}
@Override
public boolean equals(Object obj) {
SuggestionDetailBean suggestionDetailBean = (SuggestionDetailBean) obj;
if(StringUtils.isEmpty(this.getTagList())){
return this.getUrl().equals(suggestionDetailBean.getUrl());
}
else {
return (this.getTagList().equals(suggestionDetailBean.getTagList())) &&
(this.getUrl().equals(suggestionDetailBean.getUrl()));
}
}
}
Edit :
Remarque : si je convertir le hashset à un treeset à l'aide de :
Set<SuggestionDetailBean> sortedSet = new TreeSet<SuggestionDetailBean>(hashset);
Puis un tri correct est maintenue, ainsi que la suppression des doublons est basé sur l'objet hashcode et equals méthodes qui n'ont pas la méthode compareto.
OriginalL'auteur blue-sky | 2013-02-13
Vous devez vous connecter pour publier un commentaire.
Selon la Javadoc de
TreeSet
:Donc, le problème est avec votre
compareTo
méthode: soit c'est de donner des résultats incohérents, ou bien qu'il donne des résultats cohérents qui n'obéissent pas à la règle quia.compareTo(b) == 0
si et seulement sia.equals(b)
.Pour exemple ce morceau:
signifie "si
this
ouother
adate == null
, alors quethis
etother
sont" égaux", qui n'est certainement pas ce que vous voulez.Si vous effectuez toutes vos dé-duplication dans un
HashSet
et ensuite copier ces éléments à unTreeSet
, alors bien sûr, leTreeSet
de ne pas contenir des doublons. Mais ce n'est pas vraiment le droit de les corriger. Le droit fixe est de corriger votrecompareTo
méthode afin queTreeSet
'notion de "double" correspond àHashSet
'.OriginalL'auteur ruakh