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集合中的元素中的元素是同一种数据类型。