java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二

TreeSet有序子类;

HashSet无序子类

重复重复元素,Object对象是通过equals和hashCode来进行过滤的。

如果将上一篇提到中的例子中的TreeSet,换成HashSet,那么代码就不会过滤从的对象

HashSet无序子类,如何过滤重复的对象呢?(单个元素是可以过滤,但相同的对象不会)

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{
			//如果age年龄相同需要在判断name,是否重复
			return this.name.compareTo( o.name );
		}
	}

}

  

SetDemo3:

Set<Person> allSet = new HashSet<Person>();

		allSet.add(new Person("张三",30));
		//重复对象
		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));
		//重复对象
		allSet.add(new Person("田七",32));

		System.out.println(allSet);

输出结果:

[姓名:王五, 年龄:31, 姓名:田七, 年龄:32, 姓名:田七, 年龄:32, 姓名:张三, 年龄:30, 姓名:张三, 年龄:30, 姓名:李四, 年龄:30, 姓名:赵六, 年龄:31]

这时需要过滤掉重复的对象,那么Person还需要复写equels,和HashCode两个方法,这两个方法作用了过滤重复的对象:

public int hashCode()
	{
		return this.name.hashCode() * this.age;
	}

	public boolean equals(Object o)
	{
		if(this == o)
		{
			return true;
		}
		if( !(o instanceof Person) )
		{
			return false;
		}
		Person p = (Person) o;
		if(this.name.equals(p.name) && this.age == p.age)
		{
			return true;
		}else{
			return false;
		}

	}

  

执行的结果:

[姓名:赵六, 年龄:31, 姓名:李四, 年龄:30, 姓名:张三, 年龄:30, 姓名:王五, 年龄:31, 姓名:田七, 年龄:32]

  

时间: 2024-08-26 14:36:34

java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二的相关文章

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

Java深入了解TreeSet

Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一.那TreeSet为什么能保证元素唯一,它是怎样排序的呢?先看一段代码: public static void demo() { TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("张三", 23)); ts.add(new Person("李四", 13)); ts

练习:往HashSet中存储学生对象(姓名,年龄) 同姓名,同年龄视为一个人,不存

具体源码实现 package com.runoob.test; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class HashSetTest { public static void main(String[] args) { // TODO Auto-generated method stub /* * 练习:往HashSet中存储学生对象(姓名,年龄) 同姓名,同年龄视为

Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 上一篇总结了下ArrayList .LinkedList和Vector比较,今天泥瓦匠总结下Hash .LinkedList和Vector比较.其实大家都是Collection,只不过有点各自特性.那就是数据结构的不同表现. 一.Set回顾 一个不包括重复元素(包括可变对象)的Collection,是一种无序的集合.Set不包含满 a.equals(b) 的元素对a和b,并且最多有一个null.泥瓦

(转载)Java 容器 &amp; 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

上一篇总结了下ArrayList .LinkedList和Vector比较,今天泥瓦匠总结下Hash .LinkedList和Vector比较.其实大家都是Collection,只不过有点各自特性.那就是数据结构的不同表现. 一.Set回顾 一个不包括重复元素(包括可变对象)的Collection,是一种无序的集合.Set不包含满 a.equals(b) 的元素对a和b,并且最多有一个null.泥瓦匠的记忆宫殿:1.不允许包含相同元素 2.判断对象是否相同,根据equals方法 二.HashSe

Java集合详解7:HashSet,TreeSet与LinkedHashSet

Java集合详解7:HashSet,TreeSet与LinkedHashSet 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/12/colle

《java入门第一季》之HashSet存储自定义对象问题以及注意事项

上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存储规律的.上次存储的是字符串,那么这里看看存储自定义对象是不是也是同样的规律.其实这里有着很多的问题需要讨论. 存储自定义对象,代码写了出来: import java.util.HashSet; public class HashSetDemo2 { public static void main(

将子类对象引用赋值给超类对象 JAVA 编译时多态性

将子类对象引用赋值给超类对象 JAVA 编译时多态性(转) (2012-05-10 11:24:05) 转载▼ 标签: 杂谈 分类: 也无晴_soft 1.通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. DerivedC c2=new DerivedC(); BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类 a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法 分

Android(java)学习笔记179:有序广播和无序广播

之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播:   1.   我们首先了解一下有序广播和无序广播区别和联系? (1) 有序广播> 接受者有优先级,接受按照先后顺序接受,类似中央向下传文件.高优先级的接受者可以把广播消息给拦截,还可以修改广播的数据.(2)无序广播> 接受者没有优先级,没有先后顺序.类似听广播,看新闻联播.不可以被拦截.> sendBroadcast(intent) (3).有序广播和无序广播没有什么本质的区别,相同