黑马程序员——集合框架(TreeSet)
2015-04-01 15:17
351 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
Set:无序,不可以重复元素。
|——HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。
|——TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据。
通过对象中的compareTo方法确定元素的大小,和确定是否相同。
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接
口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫作默认顺
序。
TreeSet集合的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时就有了比较方式。
TreeSet增加元素示例:
aaa
abcd
bca
cba
有结果可知TreeSet默认实现自然排序。
向TreeSet集合中添入自定义对象。
此对象必须实现Comparable接口的方法,compareTo();
排序时,当主要条件相同时,一定要判断一下次要条件。
程序举例:
TreeSet底层数据结构:
红黑树,二叉树。自动取则中值。
取值:
从最左边开始取。每个一个节点的左边必小于右边。
如果将自定义对象的compareTo方法复写成:
public int compareTo(Object obj)
{
return 1;
}
则TreeSet里面存自定义对象时,都认为存入的下一个值比上一个值大,都存在二叉树的右边。
在获取该TreeSet里面的数据时,会将存入的先后值依次打印出,也就是怎么存入怎么取出。
练习: 按照字符串长度排序
Set:无序,不可以重复元素。
|——HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。
|——TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据。
通过对象中的compareTo方法确定元素的大小,和确定是否相同。
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接
口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫作默认顺
序。
TreeSet集合的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时就有了比较方式。
TreeSet增加元素示例:
import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.add("cba"); ts.add("aaa"); ts.add("bca"); ts.add("abcd"); Iterator it = ts.iterator(); while(it.hasNext()) System.out.println(it.next()); } }控制台显示结果:
aaa
abcd
bca
cba
有结果可知TreeSet默认实现自然排序。
向TreeSet集合中添入自定义对象。
此对象必须实现Comparable接口的方法,compareTo();
排序时,当主要条件相同时,一定要判断一下次要条件。
程序举例:
import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { TreeSet<Student> ts = new TreeSet<Student>(); ts.add(new Student("lisi01",18)); ts.add(new Student("lisi02",19)); ts.add(new Student("lisi04",18)); ts.add(new Student("lisi04",18)); Iterator<Student> it = ts.iterator(); while(it.hasNext()) { Student stu = it.next(); System.out.println(stu.getName()+"......"+stu.getAge()); } } } class Student implements Comparable<Student>//该接口强制让学生具备比较性。 { private String name; private int age; Student(String name,int age) { this.setName(name); this.setAge(age); } 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; } @Override public int compareTo(Student o) { if(this.age>o.age) return 1; else if(this.age==o.age) return this.name.compareTo(o.getName()); else return -1; } }
TreeSet底层数据结构:
红黑树,二叉树。自动取则中值。
取值:
从最左边开始取。每个一个节点的左边必小于右边。
如果将自定义对象的compareTo方法复写成:
public int compareTo(Object obj)
{
return 1;
}
则TreeSet里面存自定义对象时,都认为存入的下一个值比上一个值大,都存在二叉树的右边。
在获取该TreeSet里面的数据时,会将存入的先后值依次打印出,也就是怎么存入怎么取出。
import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; /* * 当元素自身不具备比较性,或者具备的比较性不是所需要的。 * 这时需要让容器自身具备比较性。 * 定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 * * 当两种排序都存在时,以比较器为主。 * * 定义一个类,实现Comparator接口,覆盖compare方法。 * * */ public class TreeSetDemo2 { public static void main(String[] args) { Comparator<Student> com= new Comparator<Student>(){ //这个类本身就继承了equals方法,所以可以不覆盖equals方法。 @Override public int compare(Student s1, Student s2) { // TODO 自动生成的方法存根 if(s1.getName().compareTo(s2.getName())!=0) { return s1.getName().compareTo(s2.getName()); } else if(s1.getAge()>s2.getAge()) { return 1; } else if(s1.getAge()<s2.getAge()) { return -1; } else { return 0; } } //return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()); }; TreeSet<Student> ts = new TreeSet<Student>(com); ts.add(new Student("lisi01",18)); ts.add(new Student("lisi02",19)); ts.add(new Student("lisi04",18)); ts.add(new Student("lisi001",19)); Iterator<Student> it = ts.iterator(); while(it.hasNext()) { Student stu = it.next(); System.out.println(stu.getName()+"......"+stu.getAge()); } } } class Student implements Comparable<Student>//该接口强制让学生具备比较性。 { private String name; private int age; Student(String name,int age) { this.setName(name); this.setAge(age); } 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; } @Override public int compareTo(Student o) { if(this.age>o.age) return 1; else if(this.age==o.age) return this.name.compareTo(o.getName()); else return -1; } }
练习: 按照字符串长度排序
import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { //自定义比较方式。 Comparator<String> mycomp = new Comparator<String>(){ @Override public int compare(String s1, String s2) { int num = new Integer(s1.length()).compareTo(s2.length()); if(num == 0) return s1.compareTo(s2); return num; } }; TreeSet<String> ts = new TreeSet<String>(mycomp); ts.add("abcd"); ts.add("ccc"); ts.add("cba"); ts.add("z"); ts.add("hahaha"); Iterator<String> it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
相关文章推荐
- 黑马程序员_JavaSE基础17 之 集合框架 Vector LinkedList ArrayList HashSet LinkedHasSet TreeSet
- 黑马程序员——第15天——(API)集合框架(TreeSet,泛型)
- 黑马程序员------TreeSet集合框架存储自定义元素之排序Comparable与Comparator
- 黑马程序员——>第十五天<集合框架(TreeSet-泛型)>
- 黑马程序员 集合框架之TreeSet实例
- 黑马程序员--集合之HashSet/TreeSet原理
- 黑马程序员_Java第14天知识总结_集合类(集合框架)_Collection_迭代器_List_Set_HashSet
- 黑马程序员,定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
- 黑马程序员java学习—集合框架List和Set
- 集合框架-TreeSet存储自定义对象
- 黑马程序员_集合之Set(HashSet与TreeSet)
- 黑马程序员_java_集合框架_Collection_List_Set_Map_泛型
- 黑马程序员_day18_集合框架 List 、Set
- 黑马程序员_学习笔记:10) 集合框架2:Set(HashSet、TreeSet)、Map(Hashtable、HashMap、TreeMap)、Collections、Arrays
- 黑马程序员:集合框架Set
- 黑马程序员-----------------集合框架-Set
- 黑马程序员__集合框架(List,Set)
- 黑马程序员 java基础之TreeSet集合
- 黑马程序员--07.集合框架--05.【集合Set】【哈希表】
- java学习笔记:集合框架之TreeSet