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
}
}
新建一个TestTreeSet测试类:
package com.mybatias.model;
import java.util.Comparator;
import java.util.TreeSet;
public class TestTreeSet {
}
测试结果:
修改对象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;
//}
}
import java.util.Comparator;
import java.util.TreeSet;
public class TestTreeSet {
}
通过上面这样方式的修改,可以有效的避免TreeSet中的重复数据。
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中的重复数据。
相关文章推荐
- 从头认识java-15.4 使用TreeSet需要注意的地方
- 使用update更新MongoDB文档应注意的问题,即使使用了$inc\$set等
- Linux文件锁使用注意问题(F_SETFK F_SETFKW F_GETFK) (F_RDLCK F_WRLCK F_UNLCK)
- 使用std的vector,map,list, set等注意问题
- 使用VS.NET需要注意的问题
- 在struts开发中使用validator验证时应该注意的基本问题
- 如何使用C#压缩文件及注意的问题!
- 使用静态数组应该注意的问题
- 使用SQL存储过程要特别注意的问题-注意顺序读取
- 使用TUT要注意的问题
- 使用IPAddress解析IP地址时要注意的问题
- 在httpservlet中同时使用getParameter和getInputStream时注意的问题
- [原创]使用DropDownlist时应该注意的一个小问题
- xloadtree Demo本地使用问题
- CArray 模板使用时应注意的问题.
- ASP.NET中使用数据处理插入数据注意的问题
- 使用Intellij IDEA 4.0要注意的问题
- 在使用微软提供的安全模版(安全策略)时需要注意的安全问题
- 使用String.split方法时要注意的问题
- 使用ASP调用WebService时要注意的问题(修正)