JAVA类集----Set接口排序及重复元素说明

import java.util.Set;
import java.util.TreeSet;

public class Person{
	private String name;
	private int age;
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.age;
	}
	
	public static void main(String[] args){
		Set<Person> allSet = new TreeSet<Person>();
		allSet.add(new Person("张三", 30));
		allSet.add(new Person("李四", 31));
		allSet.add(new Person("王五", 32));
		allSet.add(new Person("王五", 32));
		allSet.add(new Person("王五", 33));
		allSet.add(new Person("赵六", 33));
		allSet.add(new Person("孙七", 33));
		System.out.println(allSet);
	}
}

执行时出现以下错误:

Exception in thread "main" java.lang.ClassCastException: Person cannot be cast t
o java.lang.Comparable
        at java.util.TreeMap.compare(Unknown Source)
        at java.util.TreeMap.put(Unknown Source)
        at java.util.TreeSet.add(Unknown Source)
        at Person.main(Person.java:17)

修改如下:继承Comparable接口,覆写compareTo()方法

import java.util.Set;
import java.util.TreeSet;

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 toString(){
		return "姓名:" + this.name + ";年龄:" + this.age;
	}
	
	public int compareTo(Person per){
		if(this.age < per.age){
			return 1;
		}else if(this.age > per.age){
			return -1;
		}else{
			return 0;
		}
	}
	
	public static void main(String[] args){
		Set<Person> allSet = new TreeSet<Person>();
		allSet.add(new Person("张三", 30));
		allSet.add(new Person("李四", 31));
		allSet.add(new Person("王五", 32));
		allSet.add(new Person("王五", 32));
		allSet.add(new Person("王五", 33));
		allSet.add(new Person("赵六", 33));
		allSet.add(new Person("孙七", 33));
		System.out.println(allSet);
	}
}
此时完成了排序,但是年龄相同的元素没有了,继续修改。

import java.util.Set;
import java.util.TreeSet;

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 toString(){
		return "姓名:" + this.name + ";年龄:" + this.age;
	}
	
	public int compareTo(Person per){
		if(this.age < per.age){
			return 1;
		}else if(this.age > per.age){
			return -1;
		}else{
			return this.name.compareTo(per.name);	//调用String中的compareTo()方法
		}
	}
	
	public static void main(String[] args){
		Set<Person> allSet = new TreeSet<Person>();
		allSet.add(new Person("张三", 30));
		allSet.add(new Person("李四", 31));
		allSet.add(new Person("王五", 32));
		allSet.add(new Person("王五", 32));
		allSet.add(new Person("王五", 33));
		allSet.add(new Person("赵六", 33));
		allSet.add(new Person("孙七", 33));
		System.out.println(allSet);
	}
}
此时并没有去掉重复的元素,要想去掉重复元素,则需要Object类中的两个方法帮助:

1.hashCode():表示一个唯一的编码,一般通过计算表示

2.equals():进行对象的比较操作

import java.util.Set;
import java.util.HashSet;

public class Person{
	private String name;
	private int age;
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.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(){
		return this.name.hashCode() * this.age;	//定义一个公式
	}
	
	public static void main(String[] args){
		Set<Person> allSet = new HashSet<Person>();
		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);
	}
}
总结:

1.一个好的类应该覆写Object类中的equals()、hashCode()、toString()方法,String类中已经覆写完成了。
2.Set接口依靠hashCode()和equals()完成重复元素的判断

3.TreeSet依靠Comparable接口完成排序的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值