java TreeSet 实现存自定义不可重复数据
本文主要是介绍一下java集合中的比较重要的Set接口下的可实现类TreeSet
TreeSet类,底层用二叉树的数据结构
* 集合中以有序的方式插入和抽取元素。
* 添加到TreeSet中的元素必须是可以排序的
* 保证数据的唯一性:
* 第一种:让添加的类自身具有可比较性,
* 实现Comparable接口中的CompareTo()方法
package com.tercher.demo; import java.util.Iterator;
import java.util.TreeSet; public class TreeSetDemo {
public static void main(String[] args) { /*
* TreeSet类,底层用二叉树的数据结构
* 集合中以有序的方式插入和抽取元素。
* 添加到TreeSet中的元素必须是可以排序的
* 保证数据的唯一性:
* 第一种:让添加的类自身具有可比较性,
* 实现Comparable接口中的CompareTo()方法
* 第二种:当元素自身不具备可比较性时,
* 或者具备的比较是不需要的,
* 此时,可以自定义一个比较器(类)
* 此类实现Comparator中的CompareTo()方法
* 最后在实例化TreeSet时传参数比较器类
*/
TreeSet ts = new TreeSet();
ts.add(new Wimen("xiaobai", 10));
ts.add(new Wimen("xiaobai1", 14));
ts.add(new Wimen("xiaobai2", 5));
ts.add(new Wimen("xiaobai2", 5));
ts.add(new Wimen("xiaobai3", 34)); Iterator<Wimen> it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
} }
/*
* 添加类中实现Comparable方法中CompareTo()方法
* 按对象的年龄进行排序存储,并把相同的属性的对象剔除
*/ class Wimen implements Comparable{
private String name;
private int age; public Wimen(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Wimen [age=" + age + ", name=" + name + "]";
}
@Override
public int compareTo(Object o) {
if (!(o instanceof Wimen)) {
throw new ClassCastException("对象不匹配!!1");
}
Wimen wimen = (Wimen) o;
if (this.age > wimen.age) {
return 1;
}
if (this.age==wimen.age ) {
return this.name.compareTo(wimen.name);
}
return -1; // 1: 正序 0: 只存放第一个元素 -1: 倒序
} }
首先建立一个添加的类型,如下定义,让元素自身具备可比较性
* 添加类中实现Comparable方法中CompareTo()方法
* 按对象的年龄进行排序存储,并把相同的属性的对象剔除
然后再建立一个类,在里面的main方法中创建TreeSet集合,并添加Wimen类对象
结果图如下。可以看到TreeSet集合在调用add()时,内部就自动的调用了添加对象的CompareTo()方法,
并对年龄进行了排序,还对相同属性的对象进行剔除。

* 第二种:自定义一个比较器(类)
* 此类实现Comparator中的CompareTo()方法
* 最后在实例化TreeSet时传参数比较器类
package com.tercher.demo; import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; public class TreeSetDemo2 {
public static void main(String[] args) { TreeSet ts = new TreeSet(new MyCom());
ts.add(new Wimen2("xiaobai", 10));
ts.add(new Wimen2("xiaobai1", 14));
ts.add(new Wimen2("xiaobai1", 14));//除去重复的,按年龄大小存储
ts.add(new Wimen2("xiaobai2", 5));
ts.add(new Wimen2("xiaobai3", 34)); Iterator<Wimen> it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
//定义一个比较器。
class MyCom implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Wimen2 w1 = (Wimen2)o1;
Wimen2 w2 = (Wimen2)o2;
if (w1.getAge()>w2.getAge()) {
return 1;
}
if (w1.getAge()==w2.getAge()) {
return w1.getName().compareTo(w2.getName());
}
return -1;
} } class Wimen2{
private String name;
private int age; public Wimen2(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Wimen2 [age=" + age + ", name=" + name + "]";
} }

java TreeSet 实现存自定义不可重复数据的更多相关文章
- 小马哥的 Java 项目实战营学习笔记(1)
小马哥的 Java 项目实战营 小马哥的 Java 项目实战营 第二节:数据存储之 JDBC JDBC 核心 API 数据源 接口 - javax.sql.DataSource获取方式 1.普通对象初 ...
- Java实现数组去除重复数据的方法详解
一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer ...
- JAVA数组去除重复数据
一.用List集合实现 , , , , , , ,}; List<Integer> list = new ArrayList<Integer>(); ; i<str. ...
- Distinct删除重复数据时 自定义的方法比较【转】
最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时, ...
- Java里List取并集方法retainAll不能用来判断是否有重复数据!
网上找的源码 public boolean retainAll(Collection<?> c){ boolean modified = false; Iterator&l ...
- java 去除数组重复数据,并输出重复数据值
/** * 去除重复数据 * @author Sunqinbo */ public class RemoveDuplicateData { public static void main(String ...
- [leetcode]380. Insert Delete GetRandom O(1)设计数据结构,实现存,删,随机取的时间复杂度为O(1)
题目: Design a data structure that supports all following operations in average O(1) time.1.insert(val ...
- Android开发之适配器-ListView适配器的重复数据
适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数 ...
- 手把手教你如何用java8新特性将List中按指定属性排序,过滤重复数据
在java中常常会遇到这样一个问题,在实际应用中,总会碰到对List排序并过滤重复的问题,如果List中放的只是简单的String类型过滤so easy,但是实际应用中并不会这么easy,往往List ...
随机推荐
- Python的编码详解
一. 编码介绍 计算机只能处理数字(最底层的0和1),如果要处理文本,就必须将文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以一个字节能表示的最大整数就 ...
- Linux/Windows 平台最容易安装 Composer教程
我们采用的是全局安装方式,这样的话,就能够在命令行窗口中直接执行 composer 命令了. Mac 或 Linux 系统: 打开命令行窗口并执行如下命令将前面下载的 composer.phar 文件 ...
- 977 AlvinZH过生日(背包DP大作战S)
977 AlvinZH过生日 思路 难题.逆推DP. 要明确dp的状态只与是否有选择权有关,而与选择权在谁手里无关.因为不论选择权在谁手里,那个人都会尽可能的获得最大的蛋糕重量. dp[i]表示分配到 ...
- Linux基本结构
Linux 的基本目录结构: 基本介绍: Linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后再次目录下载创建其他的目录. 经典的一句话:linu ...
- Java的定时调度
一般在web开发中定时调度比较有用,因为要维护一个容器不关闭才可以一直定时操作下去. 定时调度:每当一段时间之后,程序就会自动执行,就称为定时调度.如果要使用定时调动,则必须要保证程序要始终运行着,也 ...
- python之类与对象(1)
面向对象编程是最有效的软件编写方法之一.编写类时,定义一群对象都有的通用行为.基于类创建对象时,每个对象都自动具备这种通用行为,然后可以根据需要赋予每个对象的独特的个性. 1. 类与对象的语法规范 关 ...
- 「DB」数据库事务的隔离级别
*博客搬家:初版发布于 2017/04/10 00:37 原博客地址:https://my.oschina.net/sunqinwen/blog/875833 数据库事务的隔离级别 讲事务的隔离 ...
- 【算法笔记】B1017 A除以B
1017 A除以B (20 分) 本题要求计算 A/B ,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: ...
- windbg调试驱动程序
不正确之处欢迎指正,高手勿喷~ 配置windbg路径 Symbol path:SRV*F:\Windows\symbolxp3*http://msdl.microsoft.com/download/s ...
- 剑指offer——面试题20:表示数值的字符串
#include"iostream" using namespace std; bool IsInt(const char **str); bool IsUnsignInt(con ...