---------------------- android培训、java培训、期待与您交流! ----------------------
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表。线程时非同步的。
HashSet是如何保证元素唯一性呢?是通过元素的两个方法,HashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。
|--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法return 0;
TreeSet 排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet 的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合已初始化时,就有了比较方式。
(都是常用的)
set集合的功能和Collection是一致的。
案例:
需求:往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。
记住:排序时,当主要条件相同时,一定判断一下次要条件。
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Student("lisi",19));
ts.add(new Student("lisi01",30));
ts.add(new Student("lisi02",19));
ts.add(new Student("lisi09",38));
Iterator it = ts.iterator();
while(it.hasNext()){
Student stu = (Student)it.next();
System.out.println(stu.getName()+"...." + stu.getAge());
}
}
}
class Student implements Comparable{//该接口强制让学生具备比较性。
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
public int compareTo(Object obj){
if(!(obj instanceof Student)){
throw new RuntimeException("不是学生对象");
}
Student s = (Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
//return 0;
return -1;
}
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;
}
}
比较器:
import java.util.*;
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数专递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类实现Comparator接口,覆盖compare方法。
二叉树都是以return 0 来判断元素是否相同
public class TreeSetDemo2 {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Student1("lisi",19));
ts.add(new Student1("lisi01",30));
ts.add(new Student1("lisi02",19));
ts.add(new Student1("lisi09",38));
ts.add(new Student1("lisi09",34));
Iterator it = ts.iterator();
while(it.hasNext()){
Student1 stu = (Student1)it.next();
System.out.println(stu.getName()+"...." + stu.getAge());
}
}
}
class Student1 implements Comparable{//该接口强制让学生具备比较性。
private String name;
private int age;
public Student1(String name,int age){
this.name = name;
this.age = age;
}
public int compareTo(Object obj){
if(!(obj instanceof Student)){
throw new RuntimeException("不是学生对象");
}
Student1 s = (Student1)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
//return 0;
return -1;
}
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;
}
}
class MyCompare implements Comparator{
public int compare(Object o1, Object o2) {
Student1 s1 = (Student1) o1;
Student1 s2 = (Student1) o2;
int num = s1.getName().compareTo(s2.getName());
if(num==0){
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
// if(s1.getAge()>s2.getAge()){
// return 1;
// }
// if(s1.getAge()==s2.getAge())
// return 0 ;
// return -1;
}
return num;
}
}
练习:按照字符串长度排序
字符串本身具备比较性,但是它的比较方式不是需要的。
这时就只能使用比较器。
import java.util.*;
public class TreeSetTest {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new StringLenComparator());
ts.add("adcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class StringLenComparator implements Comparator{
public int compare(Object o1, Object o2) {
String s1 = (String) o1;
String s2 = (String) o2;
// if(s1.length()>s2.length())
// return 1;
// if(s1.length()==s2.length())
// return 0;
// return -1;
System.out.println(".....");
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);
return num;
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------