排序及重复元素说明

本章目标
掌握TreeSet的排序原理
掌握Set接口中重复元素的定义

 

关于TreeSet的排序说明
一个普通的类对象是不能向TreeSet集合中加入的,如果直接加入会出现以下的异常:
——java.lang.ClassCastException
如果要想使用TreeSet则对象所在的类必须实现Compable接口

 

排序类

import java.util.Set;
import java.util.TreeSet;
class Person implements Comparable<Person>{//定义 Person 类,实现比较器
	private String name;//定义 name 属性
	private int age;//定义 age 属性
	public Person(String name, int age) {//通过构造方法为属性赋值
		this.name = name;//为 name 属性赋值
		this.age = age;//为 age 属性赋值
	}
	public String toString(){//覆写 toString() 方法
		return "姓名:"+this.name+";年龄:"+this.age;
	}
	public int compareTo(Person per){//覆写 compareTo() 方法,指定排序规则
		if(this.age > per.age){//按照年龄排序
			return 1;
		}else if(this.age <per.age){
			return -1;
		}else{
			return 0;
		}
	}
}
public class TreeSetDemo03 {
	public static void main(String[] args){
		Set<Person> allSet = new TreeSet<Person>();//实例化 Set 接口对象
		allSet.add(new Person("张三", 30));//加入元素
		allSet.add(new Person("李四", 31));//加入元素
		allSet.add(new Person("王五", 32));//加入元素
		allSet.add(new Person("王五", 32));//重复元素,不能加入
		allSet.add(new Person("王五", 32));//重复元素,不能加入
		allSet.add(new Person("赵六", 33));//加入元素
		allSet.add(new Person("孙七", 33));//年龄重复
		System.out.println(allSet);//输出集合,调用 toString()
	}
/* 结果:
 * [姓名:张三;年龄:30, 姓名:李四;年龄:31, 姓名:王五;年龄:32, 姓名:赵六;年龄:33]
 * */
}

 

关于重复元素的说明
Set接口中是不允许存放重复元素的
一个类的对象是否重复需要依靠Object类中的以下方法完成:
——hashCode():指定哈希码
——equals():对象比较

 

重复对象判断

import java.util.HashSet;
import java.util.Set;
class Person {//定义 Person 类,实现比较器
	private String name;//定义 name 属性
	private int age;//定义 age 属性
	public Person(String name, int age) {//通过构造方法为属性赋值
		this.name = name;//为 name 属性赋值
		this.age = age;//为 age 属性赋值
	}
	public boolean equals(Object obj){//覆写 equals() 方法
		if(this == obj){//地址相等
			return true;//是同一个相等
		}
		if(!(obj instanceof Person)){//传递进来的不是本类的对象
			return false;//不是同一个对象
		}
		Person p = (Person)obj;//进行向下转型
		if(this.name.equals(p.name)&&this.age==p.age){
			return true;//属性依次比较
		}else{//全部属性相等,是同一对象
			return false;//属性不相等,不是同一对象
		}
	}
	public int hashCode(){//覆写 hashCode() 方法
		return this.name.hashCode()*this.age;//指定编码公式
	}
	public String toString(){//覆写 toString() 方法
		return "姓名:"+this.name+";年龄:"+this.age;
	}
}
public class RepeatDemo02 {
	public static void main(String[] args){
		Set<Person> allSet = new HashSet<Person>();//实例化 Set 接口对象
		allSet.add(new Person("张三", 30));//加入元素
		allSet.add(new Person("李四", 31));//加入元素
		allSet.add(new Person("王五", 32));//加入元素
		allSet.add(new Person("王五", 32));//重复元素,不能加入
		allSet.add(new Person("王五", 32));//重复元素,不能加入
		allSet.add(new Person("赵六", 33));//加入元素
		allSet.add(new Person("孙七", 33));//年龄重复
		System.out.println(allSet);//输出集合,调用 toString()
	}
/* 结果:
 * [姓名:张三;姓名:30, 姓名:李四;姓名:31, 姓名:王五;姓名:32, 姓名:赵六;姓名:33]
 * */
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值