javase第十八讲迭代器、TreeSet及Comparator

iterator

iterator(迭代器):iterator()方法是Interator接口的类型,但并不是说它是返回一个接口,只是返回实现这个接口的类的实例,但是具体是那一个类我们无从得知,我们只知道可以通过这个接口的方法去操纵返回回来的对象,这就是多态。

步骤:

  1. 通过调用类集的iterator()方法获得对类集头的迭代函数。
  2. 建立一个调用hasNext()方法的循环,只要hasNext()返回true,就进行循环迭代。
  3. 在循环内部,通过调用next()方法来得到每一个元素。
package iterator;

import java.util.HashSet;
import java.util.Iterator;

/**
 * @Auther: Xinbai
 * @Date:2020/5/10 9:47
 */
public class IteratorTest {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("a");
        set.add("b");
        set.add("c");
        set.add("d");
        set.add("e");

        Iterator iter = set.iterator();
        while (iter.hasNext()) {
            String value = (String) iter.next();
            System.out.println(value);
        }

    }
}

输出结果:
a
b
c
d
e

除了用while。for循环也可以

 for (Iterator iter1 = set.iterator(); iter.hasNext(); ) {
            String value = (String) iter.next();
            System.out.println(value);
        }

SortedSet

SortedSet 定义的排序规则有两种:
1). natural ordering 自然排序。
2). Comparator ordering 通过特定定义的规则来排序,通常这种定义的规则是由自己来定义的。

SortedSet接口的实现类及相应的方法,一般用的最多的是TreeSet这个实现类,这个类实现了SortedSet接口,所有它是带排序的。

TreeSet和Comparator

package iterator;

import java.util.TreeSet;

/**
 * @Auther: Xinbai
 * @Date:2020/5/10 11:09
 */
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet set=new TreeSet();
        set.add("C");
        set.add("S");
        set.add("D");
        set.add("N");
        set.add("A");
        System.out.println(set);
    }

输出结果:
[A, C, D, N, S]
【说明】:这边可以看出排序是有序,定义的规则是TreeSet中的自然法则来排序的。

自定义排序

例子1、打印正序字母

package iterator;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * @Auther: Xinbai
 * @Date:2020/5/10 11:33
 */
public class TreeSetTest1 {
    public static void main(String[] args) {
        TreeSet set=new TreeSet();

        set.add("C");
        set.add("S");
        set.add("D");
        set.add("N");

        Iterator iter=set.iterator();
        while (iter.hasNext()){
            String value=(String)iter.next();
            System.out.println(value);
        }

    }
}

输出结果:
C
D
N
S
【说明】:在没有定义规则之前,程序排序是按自然规则排序,打印的。现在利用Iterator接口的实现类定义自己的排序规则[将英文元素倒序排序]

例子2、反序输出
定义排序规则步骤:

  1. 选择TreeSet中的构造方法:public TreeSet(Comparator comparator)这个构造方法。
  2. 定义一个类实现Comparator这个接口
  3. 实现这个接口中的 compare(T o1, T o2)方法。[这个方法就是体现自定义的规则,这个规则在这个方法中体现]
package iterator;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * @Auther: Xinbai
 * @Date:2020/5/10 11:33
 */
public class TreeSetTest1 {
    public static void main(String[] args) {
        TreeSet set=new TreeSet(new TSet());

        set.add("C");
        set.add("S");
        set.add("D");
        set.add("N");


        Iterator iter=set.iterator();
        while (iter.hasNext()){
            String value=(String)iter.next();
            System.out.println(value);
        }
    }
}

class  TSet implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        String s1=(String)o1;
        String s2=(String)o2;
        return s2.compareTo(s1);
    }
}

输出结果:
S
N
D
C

package iterator;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * @Auther: Xinbai
 * @Date:2020/5/10 11:17
 */
public class TreeSetTest2 {

    public static void main(String[] args) {
        TreeSet set = new TreeSet(new PerComparator());

        Student s1 = new Student(10);
        Student s2 = new Student(20);
        Student s3 = new Student(30);
        Student s4 = new Student(40);
        Student s5 = new Student(50);

        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        //  System.out.println(set);
        Iterator iter = set.iterator();
        while (iter.hasNext()) {
            Student value = (Student) iter.next();
            System.out.println(value.score);
        }

    }
}

class Student {
    int score;

    public Student(int score) {
        this.score = score;
    }
//重写这个toString方法是为了main方法中的打印set能打印出score,如果不重写这个方法,则直接调用set的这个引用的toString方法
    public String toString() {
        return String.valueOf(this.score);
    }
}

class PerComparator implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        Student ss1 = (Student) o1;
        Student ss2 = (Student) o2;
        return ss1.score - ss2.score;
    }
}

输出结果:
10
20
30
40
50

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值