Iterator接口、Set类工作原理以及SortedSet<E>构造与Comparator<T>-
想Set当中加入元素比较简单,使用add(),remove(),isEmpty(),size()等方法即可.
但是通过Set,将其中的内容取出来就不是像List那样,可以通过下标一个个的取出,而是通过Iterator(迭代器取出).
Iterator是一个接口,有如下三个方法:

其中第一个方法和第二个方法经常是配合使用,用于将Set中的元素一一取出.
Iterator方法的工作原理如下图:

使用迭代器的步骤:
每一个Collection类都提供一个iterator()方法,这样每一个Set或者List都可以使用Iterator接口提供的方式遍历其中的每一个元素.
因此步骤如下:
1> 通过调用集合类的iterator()方法获得对相应的实现Iterator接口的对象;
2> 建立一个调用hasNext()方法的循环.只要hasNext()方法返回true,就进行循环迭代;
3> 在循环的内部,通过调用next()方法来得到每一个元素.
例:
package cn.edu.bupt.array;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorTest1
{
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
Iterator<String> itr = set.iterator();
while(itr.hasNext())
{
System.out.println(itr.next());
}
}
}
结果:

也可以这样子书写:
package cn.edu.bupt.array;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorTest1
{
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
for (Iterator<String> itr = set.iterator(); itr.hasNext();)
{
System.out.println(itr.next());
}
}
}
Iterator使用频率很高.
【调试与查错技巧 】 四十六-25:00 通过异常的提示和Java帮助文档完全可以定位错误的原因,或者也可以去网上搜索原因
SortedSet 是 Set的子接口, 对于SortedSet接口,经常使用的实现类是TreeSet
TreeSet 的使用方式和 Set 使用方式非常相似。
对于TreeSet的排序规则,需要通过自定义类实现Comparator接口进行指定,如果不实现该接口的话,当加入对象到集合中时,会发生ClassCastException异常。
Comparator类的主要职责是为了将TreeSet中原本无序的元素按照它的规则进行排序。


【TreeSet<E>类 与Comparator<T>接口实现详解】 四十七-10:00
例:实现一
package cn.edu.bupt.array;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetTest1
{
public static void main(String[] args)
{
TreeSet<Student> set = new TreeSet<Student>(new Student());
Student s1 = new Student("zhangsan", 6);
Student s2 = new Student("lisi", 7);
Student s3 = new Student("wangwu", 8);
set.add(s1);
set.add(s2);
set.add(s3);
for (Iterator<Student> itr = set.iterator(); itr.hasNext();)
{
System.out.println(itr.next().toString());
}
}
}
class Student implements Comparator<Student>
{
private String name = null;
private int age = 0;
public Student()
{
}
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public int compare(Student o1, Student o2)
{
return (o1.age - o2.age) * (o1.name.compareTo(o2.name));
}
@Override
public String toString()
{
return "name: " + this.name + "; age: " + this.age;
}
}
实现二(通过私有内部类实现):
package cn.edu.bupt.collection; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class PersonTreeSet { public static void main(String[] args) { PersonTreeSet pt = new PersonTreeSet(); Person p1 = pt.new Person(10); Person p2 = pt.new Person(20); Person p3 = pt.new Person(30); Set<PersonTreeSet.Person> set = new TreeSet<PersonTreeSet.Person>(p1); set.add(p1); set.add(p2); set.add(p3); for (Iterator<PersonTreeSet.Person> itr = set.iterator(); itr.hasNext();) { System.out.println(itr.next()); } } private class Person implements Comparator<Person> { private int score; public Person(int score) { this.score = score; } @Override public int compare(Person o1, Person o2) { return o2.score - o1.score; } @Override public String toString() { return String.valueOf(this.score); } } }
注意:这里仍然需要单独写出一个实现了Comparator<T>的类,然后生成一个单独的对象,传递给TreeSet的构造函数,在视频中也是这样做的,而且视频中是实现了三个类,而我这里将后两个类合并为一个类了。
注意:集合TreeSet<Student> 中放置的是Studnet类型的对象,因此实现compare方法的参数也是需要Student类型参数,或者是Student类的父类参数,这可以通过TreeSet类的构造方法泛型看出来。视频中将的是Object类型,是因为没有使用泛型的缘故,因此需要进行强制类型转换成为Student类型。

Collections类完成对集合体系的相关操作,其中全部都是静态方法:
类似于Arrays类对数组相关操作,Collections类完成对集合的相关操作.
Collections是类,而Collection是接口.注意区别.
Collections中sort()方法和reverseOrder()方法:
Collections.shuffle()方法:
Collections.sort()和Collections.reverseOrder()方法:
示例:
package cn.edu.bupt.array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetTest1
{
public static void main(String[] args)
{
TreeSet<Student> set = new TreeSet<Student>(new Student());
Student s1 = new Student("zhangsan", 6);
Student s2 = new Student("lisi", 7);
Student s3 = new Student("wangwu", 8);
set.add(s1);
set.add(s2);
set.add(s3);
for (Iterator<Student> itr = set.iterator(); itr.hasNext();)
{
System.out.println(itr.next().toString());
}
System.out.println("--------reverseOrder(), sort()--------");
Comparator<Student> reverseComparator = Collections.reverseOrder(new Student());
ArrayList<Student> list = new ArrayList<Student>(set);
Collections.sort(list, reverseComparator); //Collections.sort方法仅仅接收List集合对象,而不接收Set集合对象,因此需要进行转换
for (Iterator<Student> itr = list.iterator(); itr.hasNext();)
{
System.out.println(itr.next().toString());
}
System.out.println("-----------shuffle()----------");
Collections.shuffle(list); //重新洗牌,也就是对List其中元素的顺序随机打乱.每一次执行shuffle后均不可预料
for (Iterator<Student> itr = list.iterator(); itr.hasNext();)
{
System.out.println(itr.next().toString());
}
System.out.println("-----------min() max()------------");
System.out.println("oldest-student: " + Collections.min(set,new Student())); //按照Comparator接口指定的排序规则对集合寻找最大值和最小值
System.out.println("youngest-student: " + Collections.max(set, new Student()));
}
}
class Student implements Comparator<Student>
{
private String name = null;
private int age = 0;
public Student()
{
}
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public int compare(Student o1, Student o2)
{
return o1.age - o2.age; //按照年龄进行从小到大的排序
}
@Override
public String toString()
{
return "name: " + this.name + "; age: " + this.age;
}
}
结果如下:

浙公网安备 33010602011771号