→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

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帮助文档完全可以定位错误的原因,或者也可以去网上搜索原因

SortedSetSet的子接口, 对于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;
}
}

结果如下:

 

 



posted on 2012-03-20 18:50  阿童沐  阅读(536)  评论(0)    收藏  举报