您的位置:首页 > 其它

TreeSet使用时注意问题

2017-08-05 13:18 239 查看
TreeSet是依靠TreeMap来实现的。 

TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列,意味着TreeSet中的元素要实现Comparable接口。或者有一个自定义的比较器。 

我们可以在构造TreeSet对象时,传递实现Comparator接口的比较器对象。 

TreeSet的排序是在添加元素的时候进行排序的,即add(元素)的时候,如果在添加了元素以后,再对集合里面的数据进行修改,则会导致TreeSet集合中的元素重复,举个例子说明一下: 

新建一个Persion类 

public class Persion { 

private String pname;//名字 

private int hands;//帅气指数 

public Persion() { 

// TODO Auto-generated constructor stub 

}
public Persion(String pname, int hands) {
this.pname = pname;
this.hands = hands;
}

public int getHands() {
return hands;
}
public void setHands(int hands) {
this.hands = hands;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
@Override
public String toString() {
return "姓名:"+this.pname+"帅气指数"+this.hands;
}




新建一个TestTreeSet测试类: 

package com.mybatias.model;

import java.util.Comparator; 

import java.util.TreeSet;

public class TestTreeSet {
public static void main(String[] args) {
TreeSet<Persion> treeset=new TreeSet<Persion>(new Comparator<Persion>() {
public int compare(Persion o1, Persion o2) {
int p1=o1.getHands();
int p2=o2.getHands();
return p1-p2;
}
});
Persion  p1=new Persion("张三",100);
Persion  p2=new Persion("李四",50);
Persion  p3=new Persion("你",1000);
Persion  p4=new Persion("小明",900);
treeset.add(p1);
treeset.add(p2);
treeset.add(p3);
treeset.add(p4);
System.out.println("修改对象p4前的排序输出结果:");
System.out.println(treeset);
p4.setPname("张三");
p4.setHands(100);
System.out.println("修改对象p4后的排序输出结果:");
System.out.println(treeset);

}




测试结果: 

修改对象p4前的排序输出结果: 

[姓名:李四帅气指数50, 姓名:张三帅气指数100, 姓名:小明帅气指数900, 姓名:你帅气指数1000] 

修改对象p4后的排序输出结果: 

[姓名:李四帅气指数50, 姓名:张三帅气指数100, 姓名:张三帅气指数100, 姓名:你帅气指数1000] 

对比发现对排序后的TreeSet集合中的数据进行修改后,输出结果有重复数据,显然违背了Set集合中的数据不能重复的规则。 

通过上面的分析可以通过如下方式解决: 

将属性值定义为final类型的 

public class Persion { 

//定义为final类型的属性时,属性的初始化时必须要有值 

private final String pname; 

private final int hands; 

//Alt+/ 

public Persion() { 

pname=null;//pname为final类型,初始化的时候,给属性赋值null 

hands=0; //hands初始化值为0 



//Alt+Shift+S,o,回车 

public Persion(String pname, int hands) { 

this.pname = pname; 

this.hands = hands; 



//快捷键 Alt+Shift+S+R,空格,回车 

public int getHands() { 

return hands; 



//public void setHands(int hands) { 

// this.hands = hands; 

//} 

public String getPname() { 

return pname; 



//public void setPname(String pname) { 

// this.pname = pname; 

//}
@Override
public String toString() {
// TODO Auto-generated method stub
return "姓名:"+this.pname+"帅气指数"+this.hands;
}


}
package test;


import java.util.Comparator; 

import java.util.TreeSet;

public class TestTreeSet {
/**
*  @Description    :
*  @return         : void
*  @Creation Date  : 2016-1-15 上午8:59:11
*  @Author         :
*/
public static void main(String[] args) {
TreeSet<Persion> treeset=new TreeSet<Persion>(new Comparator<Persion>() {
public int compare(Persion o1, Persion o2) {
int p1=o1.getHands();
int p2=o2.getHands();
return p1-p2;
}
});
Persion  p1=new Persion("张三",100);
Persion  p2=new Persion("李四",50);
Persion  p3=new Persion("你",1000);
Persion  p4=new Persion("小明",900);
treeset.add(p1);
treeset.add(p2);
treeset.add(p3);
treeset.add(p4);
System.out.println(treeset);
//为了避免有重复数据,将属性的类型定义为final类型的,不能对属性值进行修改
//p4.setPname("张三");
// p4.setHands(200);
//System.out.println(treeset);

}




通过上面这样方式的修改,可以有效的避免TreeSet中的重复数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: