本文主要是介绍一下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 实现存自定义不可重复数据的更多相关文章

  1. 小马哥的 Java 项目实战营学习笔记(1)

    小马哥的 Java 项目实战营 小马哥的 Java 项目实战营 第二节:数据存储之 JDBC JDBC 核心 API 数据源 接口 - javax.sql.DataSource获取方式 1.普通对象初 ...

  2. Java实现数组去除重复数据的方法详解

    一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer ...

  3. JAVA数组去除重复数据

    一.用List集合实现   , , , , , , ,}; List<Integer> list = new ArrayList<Integer>(); ; i<str. ...

  4. Distinct删除重复数据时 自定义的方法比较【转】

    最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时, ...

  5. Java里List取并集方法retainAll不能用来判断是否有重复数据!

    网上找的源码 public boolean retainAll(Collection<?> c){     boolean modified = false;     Iterator&l ...

  6. java 去除数组重复数据,并输出重复数据值

    /** * 去除重复数据 * @author Sunqinbo */ public class RemoveDuplicateData { public static void main(String ...

  7. [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 ...

  8. Android开发之适配器-ListView适配器的重复数据

    适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数 ...

  9. 手把手教你如何用java8新特性将List中按指定属性排序,过滤重复数据

    在java中常常会遇到这样一个问题,在实际应用中,总会碰到对List排序并过滤重复的问题,如果List中放的只是简单的String类型过滤so easy,但是实际应用中并不会这么easy,往往List ...

随机推荐

  1. UITableViewCell笔记

    默认的四种cell的类型 原网站 还有这个带图的 据我自己试验,只有value2不自带imageview 不同的accessoryType 可以看到,一个tabelviewcell的contentvi ...

  2. 2016级算法第四次上机-D.AlvinZH的1021实验plus

    978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需 ...

  3. 2016级算法第四次上机-B ModricWang的序列问题

    1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...

  4. ModuleNotFoundError: No module named 'Crypto'

    pycrypto已经舍弃了使用pycryptodome,pip uninstall pycrypto,然后安装pycryptodome,pip install pycryptodome 可能还需要改名 ...

  5. QRCode简介(收藏)

      一.什么是二维码:二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的. 在许多种类的二维条码中,常 ...

  6. 分布式文件系统之FastDFS

    环境引入: 在一个大型的教育官网,会拥有大量优质的视频教程,并且免费提供给用户去下载,文件太多如果高效存储?用户访问量大如何保证下载速度?分布式文件系统是解决这些问题的有效方法之一 一.什么是文件系统 ...

  7. 【Python】Excel数据处理

    1.环境准备 > python2.7 > xlrd,xlwt模块下载与安装,前者用来读取excel文件,后者用来写入excel文件 2.实战案例 案例场景: > excel1中包含某 ...

  8. docker 把镜像打包成文件

    保存镜像为文件 docker save -o 要保存的文件名 要保存的镜像 举例: [root@iZbp16cdvzk4rhl0vn1gedZ ~]# ls aaa.cap install.sh mo ...

  9. MVC引入SERVICE层 提高代码重用性 沟通CONTROL和MODEL

    MVC是web开发中常见的程序结构. 简单的mvc结构如下: view层:显示层. control层:业务层,集合了各种action. model层:模型层,一般和数据打交道.简单的sample:一个 ...

  10. Oracle 数据表的管理

    1.创建表的的表名规则 a.必须已字母开头 b.长度不能超过30 c.不能是Oracle的保留字 d.只能使用如下字符:A-Z.a-z.1-9.#,$等 2.Oracle基本数据类型 2.1 字符型数 ...