java语法学习(7)集合之Collection接口——Set接口

Set接口

简介:
Set接口和List接口一样,同样继承自Collection接口。与其方法基本一致接口内元素无序,并且都会以某种规则保证存入的元素不出现重复。下有两个实现类HashSet 和 TreeSet

HashSet集合

e.g:
package arraylist;
import java.util.HashSet;
class Student{
	String id;
	String name;
	public Student(String id ,String name)
	{
		this.id = id;
		this.name = name;
	}
	//重写 toString 函数
	public String toString()
	{
		return id+":"+name;
	}
}
public class arraylist {
      public static void main(String[]args)
      {
    	 HashSet set = new HashSet();
         Student stu1 = new Student("1","Jack");
         Student stu2 = new Student("2","Rose");
         Student stu3 = new Student("3","Rose");
         set.add(stu1);
         set.add(stu2);
         set.add(stu3);
         System.out.println(set);
      }
}
[2:Rose, 1:Jack, 2:Rose]

输出结果中有重复值,原因是Student类中没有重写 hashCode() 和 equals()方法

package arraylist;
import java.util.HashSet;
class Student{
	private String id;
	private String name;
	public Student(String id ,String name)
	{
		this.id = id;
		this.name = name;
	}
	//重写 toString 函数
	public String toString()
	{
		return id+":"+name;
	}
	//重写 hashCode()方法
	public int hashCode()
	{
		return id.hashCode();
	}
	//重写 equals()方法
	public boolean equals (Object obj)
	{
		if(this == obj) {
			return true;
		}
		if(!(obj instanceof Student))
		{
			return false;
		}
		Student stu = (Student) obj;
		boolean b = this.id.equals(stu.id);
		return b;
	}
	
}
public class arraylist {
      public static void main(String[]args)
      {
    	 HashSet set = new HashSet();
         Student stu1 = new Student("1","Jack");
         Student stu2 = new Student("2","Rose");
         Student stu3 = new Student("2","Rose");
         set.add(stu1);
         set.add(stu2);
         set.add(stu3);
         System.out.println(set);
      }
}

TreeSet集合

TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素。集合内没有重复的元素且可以对元素进行排序
TreeSet 集合的特有方法:

函数说明
Object first()返回TreeSet 集合的首个元素
Object last()返回TreeSet 集合的首个元素
Object lower(Object o)返回TreeSet集合中小于给定元素的最大元素,如果没有返回null
Object floor(Object o)返回TreeSet集合中小于等于或等于给定元素的最大元素,如果没有返回null
Object higher(Object o)返回TreeSet集合中大于给定元素的最小元素,如果没有返回null
Object ceiling(Object o)返回TreeSet集合中大于或等于给定元素的最小元素,如果没有返回null
Object pollFirst()移除并返回集合的第一个元素
Object pollLast()移除并返回集合的最后一个元素
e.g:
package arraylist;
import java.util.TreeSet;
public class arraylist {
      public static void main(String[]args)
      {
    	TreeSet ts = new TreeSet();
    	ts.add(3);
    	ts.add(9);
    	ts.add(1);
    	ts.add(31);
    	System.out.println("创建的TreeSet集合为:" + ts);
    	// 获取首尾元素
    	System.out.println("首元素为:" + ts.first());
    	System.out.println("尾元素为:" + ts.last());
    	//比较并获取元素
    	System.out.println("小于等于9最大的元素为 " + ts.floor(9));
    	System.out.println("大于10的最小元素为 " + ts.higher(10));
    	System.out.println("大于100的最小元素为 " + ts.higher(100));
    	//删除元素
    	Object first = ts.pollFirst();
    	System.out.println("删除的第一个元素是 " + first);
    	System.out.println("删除完后的TreeSet为 " + ts);
      }
}
输出结果
创建的TreeSet集合为:[1, 3, 9, 31]
首元素为:1
尾元素为:31
小于等于9最大的元素为 9
大于10的最小元素为 31
大于100的最小元素为 null
删除的第一个元素是 1
删除完后的TreeSet[3, 9, 31]

注意:
之所以TreeSet 内的元素有序是因为每次向TreeSet()中传入一个元素时,就会将该元素与其他元素进行比较,最后将它插入到有序的对象序列中。集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable 接口中定义的,因此想要对集合中的元素进行排序,就必须实现Comparable接口,java中大部分类都实现了Comparable接口,并默认实现了接口中的compareTo()方法。如果用户自定义的类型数据没有实现Comparable 接口,因此也就没办法自接在TreeSet集合中进行排序操作。为此java提供了两种TreeSet的排序规则,分别为:自然排序和定制排序

自然排序

要求集合中存储的元素必须实现Comparable接口,并重写compareTo()方法,然后TreeSet集合就会对该类型元素,使用compareTo()方法进行比较,默认进行升序排序

package arraylist;
import java.util.TreeSet;
class Student implements Comparable{
	private int id;
	private String name;
	public Student(int id ,String name)
	{
		this.id = id;
		this.name = name;
	}
	//重写 toString 函数
	public String toString()
	{
		return id+":"+name;
	}
	//重写 hashCode()方法
	//重写 equals()方法
	public boolean equals (Object obj)
	{
		if(this == obj) {
			return true;
		}
		if(!(obj instanceof Student))
		{
			return false;
		}
		Student stu = (Student) obj;
		boolean b = this.id==stu.id;
		return b;
	}
	public int compareTo(Object obj)
	{
		Student s = (Student)obj;
		if(this.id > s.id) return 1;
		if(this.id == s.id)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
}
public class arraylist {
      public static void main(String[]args)
      {
    	 TreeSet set = new TreeSet();
         Student stu1 = new Student(10,"Jack");
         Student stu2 = new Student(2,"Rose");
         Student stu3 = new Student(9,"Rose");
         set.add(stu1);
         set.add(stu2);
         set.add(stu3);
         System.out.println(set);
      }
}

如果需要逆序就将条件改反就行。

定制排序

未实现Comparable接口时可以定制一个比较器

import java.util.TreeSet;
import java.util.Comparator;
class MyComparator implements Comparator{
	public int compare(Object obj1,Object obj2)
	{
		String s1 = (String) obj1;
		String s2 = (String) obj2;
		int temp= s1.length() - s2.length() ;
		return  temp ;
	}
}
public class arraylist {
      public static void main(String[]args)
      {
    	 TreeSet ts = new TreeSet(new MyComparator());
    	 ts.add("jack");
    	 ts.add("Helena");
    	 ts.add("Eve");
    	 System.out.println(ts);
    	 TreeSet ts2 = new TreeSet((obj1,obj2)->
    	 {
    		String s1 = (String) obj1;
    		String s2 = (String) obj2;
    		return s1.length() - s2.length();
    	 });
    	 ts2.add("jack");
    	 ts2.add("Helena");
    	 ts2.add("Eve");
    	 System.out.println(ts2);
      }
}

这个是使用了 TreeSet 集合的 public TreeSet(Comparator < ? super E > comparator) 有参构造函数。注意:在使用TreeSet集合存储数据时,TreeSet集合会对存入元素进行比较排序,所以为了程序正常运行,一定要保证存入TreeSet集合中的元素中的元素是同一种数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dearzcs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值