java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素
Set类及子类:
TreeSet有序子类;
HashSet无序(散列)子类
HashSet子类的内容是没有顺序的,单个元素也不会重复的(对象除外)。
Set<String> allSet = new HashSet<String>();
allSet.add("a");
//重复数据
allSet.add("b");
allSet.add("b");
allSet.add("c");
allSet.add("d");
//重复数据
allSet.add("e");
allSet.add("e");
allSet.add("f");
System.out.println(allSet);
TreeSet有序:
TreeSet子类实现了SortSet子类(排序)接口,TreeSet接口是可以排序的。
向TreeSet类中添加自定义对象时,该自定义对象需要复写Comparable接口中的CompareTo排序方法,否则会报:类转换异常
java.lang.ClassCastException
可能需要在复写toString()方法,否则打印的时候报错:
[org.conllection.Person@139a55, org.conllection.Person@1db9742, org.conllection.Person@106d69c]
例如:
添加数据时,有一个自定义类:Person类,2个元素,Name(名字),age(年龄),如果用年龄排序,重复年龄会被剔除掉
person:
public class Person implements Comparable<Person> { private String name;
private int age; public Person(String name, int age) {
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 "姓名:" + name + ", 年龄:" + age + "";
} public int compareTo(Person o) {
// TODO 自动生成的方法存根
if(this.age > o.age)
{
return 1;
}else if(this.age < o.age)
{
return -1;
}else{
return 0;
}
} }
setdemo2:
Set<Person> allSet = new TreeSet<Person>(); allSet.add(new Person("张三",30));
allSet.add(new Person("李四",30));
allSet.add(new Person("王五",31));
allSet.add(new Person("赵六",31));
allSet.add(new Person("田七",32)); System.out.println(allSet);
结果如下:
[姓名:张三, 年龄:30, 姓名:王五, 年龄:31, 姓名:田七, 年龄:32]
所以,应该在Comparable的CompareTo方法里面在判断name是否重复。
修改后:
public int compareTo(Person o) {
// TODO 自动生成的方法存根
if(this.age > o.age)
{
return 1;
}else if(this.age < o.age)
{
return -1;
}else{
//如果age年龄相同需要在判断name,是否重复
return this.name.compareTo( o.name );
}
}
结果如下:
[姓名:张三, 年龄:30, 姓名:李四, 年龄:30, 姓名:王五, 年龄:31, 姓名:赵六, 年龄:31, 姓名:田七, 年龄:32]
java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素的更多相关文章
- java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二
TreeSet有序子类; HashSet无序子类 重复重复元素,Object对象是通过equals和hashCode来进行过滤的. 如果将上一篇提到中的例子中的TreeSet,换成HashSet,那么 ...
- Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSe ...
- Java的类的实例化顺序
Java的类的实例化顺序 父类的静态数据 子类的静态数据 父类的成员变量 父类的构造方法 子类的成员变量 子类的构造方法
- java代码实现将集合中的重复元素去掉
package com.loaderman.test; import java.util.ArrayList; import java.util.LinkedHashSet; import java. ...
- Java思考——HashSet集合如何保证元素的唯一性也就是不包含重复元素?
首先将源码逐级找出来1.HashSet<String> hs=new HashSet<String>(); hs.add("hello"); ...
- java 查找类的所有子类
package _02; import java.io.File; import java.net.URL; public class MainTest_FindAllSubClass { publi ...
- 编写Java程序,创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck)。
返回本章节 返回作业目录 需求说明: 创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck). 父类有属性品牌(brand)和颜色(color). 在父 ...
- java高并发系列 - 第23天:JUC中原子类,一篇就够了
这是java高并发系列第23篇文章,环境:jdk1.8. 本文主要内容 JUC中的原子类介绍 介绍基本类型原子类 介绍数组类型原子类 介绍引用类型原子类 介绍对象属性修改相关原子类 预备知识 JUC中 ...
- c++模板类被继承时他的成员不能被子类看到
c++模板类被继承时他的成员不能被子类看到,必须用限定的符号 this->foo 或者 baseclass::foo,或者using bassclass::foo. msvc不提示错误,gcc ...
随机推荐
- Linux监控命令之==>iostat
一.使用说明 iostat 是对系统的磁盘I/O 操作进行监控,它的输出主要显示磁盘读写操作的统计信息,同时给出CPU 的使用情况.同vmstat 一样,iostat 不能对某个进程进行深入分析,仅对 ...
- 把自己活成AI
干啥都失败,所以从0重新开始. 把自己活成AI 准则1:一件事的对错,只代表这件事本身.多一点的解释都是错误. 准则2:大多数人默认遵守的就是规则和法律.大多数人默认承认的就是道德. 然后取其和法律的 ...
- ReportManager
package com.neusoft.report.engine; import com.neusoft.report.common.Logger; import com.neusoft.repor ...
- redis4支持内存碎片清理功能使用
最近看到redis4支持内存碎片清理了, 之前一直期待有这么一个功能, 因为之前遇到内存碎片的解决办法就是重启, 现在终于有了优雅的解决方案.\^o^/, 这个功能其实oranagra 在2017年1 ...
- 【Linux开发】Ubuntu下几个软件的配置记录backup
调用ubuntu命令行的方法:ctrl+alt+t gcc -o test test.c 开发工具包括eclipse,Qt等全部放入了/opt/路径下,java开发环境放在了/usr/local/jd ...
- C#银行卡号每隔4位数字加一个空格
1.填写银行卡号每隔4位数字加一个空格 Regex.Replace(dic["BankCardNo"].ToString(), @"(\d{4}(?!$))", ...
- centos7 VM虚拟机在主机关机重启后,无法ping通
解决办法 1.虚拟机的某些网络相关的服务没有启动,打开电脑的服务启动相关服务 2.打开虚拟机的虚拟网络设置,恢复默认设置即可 3.判定虚拟网卡的网关和centos的网关是否一致,如果不一致,改成一致, ...
- mysql驱动表与被驱动表及join优化
驱动表与被驱动表 先了解在join连接时哪个表是驱动表,哪个表是被驱动表:1.当使用left join时,左表是驱动表,右表是被驱动表2.当使用right join时,右表时驱动表,左表是驱动表3.当 ...
- C/C++ 防止头文件重复包含 #pragma once 与 #ifndef 的区别
为了避免同一个头文件被多重包含/重复包含,有两种方式: 方式一: #ifndef XXX #define XXX ... ... //声明语句 #endif //XXX 方式二: #pragma ...
- [MicroSoft]Introducing .NET 5
Introducing .NET 5 Richard https://devblogs.microsoft.com/dotnet/introducing-net-5/ 将路线图 完整的给出来了. Ma ...