迭代器与比较器

迭代器

每种合集都是可迭代的(Iterable)。可以获得集合的Iterator对象来遍历合集中的所有元素。

Collection接口继承自Iterable接口(public interface Collection<E> extends Iterable<E>)。

  • Iterable接口中定义了iterator方法,该方法会返回一个迭代器(Iterator<T> iterator();)
  • Iterator也是一个接口,它有三个方法:hasNext(); next(); remove()
    • Iterator接口为遍历各种类型的合集中的元素提供了一种统一的方法。
    • iterator是在ArrayList以内部类的方式实现的!并且,从源码可知:Iterator实际上就是在遍历集合。
import java.util.*;

public class TestIterator
{
    public static void main(String[] args)
    {
        // 1.创建合集对象
        Collection<String> collection = new ArrayList<>();

        // 2.创建元素对象;并把元素添加到合集
        collection.add("New York");
        collection.add("Atlanta");
        collection.add("Dallas");
        collection.add("Madison");

        // 3.遍历合集
        // iterator()方法返回一个Iterator的实例
        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext())
            System.out.print(iterator.next().toUpperCase() + " ");

        System.out.println();
        for(String s : collection)
            System.out.print(s.toUpperCase() + " ");

        System.out.println();
        collection.forEach(element -> System.out.print(element.toUpperCase() + " "));
    }
}

Comparator与Comparable接口

  • Comparable\(\rightarrow\)compareTo
    • Comparable用于比较实现Comparable的类的对象;
    • 使用Comparable接口来比较元素称为:使用自然顺序(natural order)进行比较。
  • Comparator\(\rightarrow\)compare
    • Comparator用于比较没有实现Comparable的类的对象;
    • 使用Comparator接口来比较元素被称为:使用比较器来进行比较。

Java API的一些类,比如StringDateCalendarBigIntegerBigDecimal以及所有基本类型的数字包装类都实现了Comparable接口。Comparable接口定义了compareTo方法,用于比较实现了Comparable接口的同一个类的两个元素

  • Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序
  • 它返回负数、0、正数来表明输入对象小于、等于、大于已经存在的对象

如果元素的类没有实现Comparable接口又将如何呢?这些元素可以比较么?

可以定义一个比较器(comparator)来比较不同类的元素。要做到这一点,需要创建一个实现java.util.Comparator<T>接口的类,并重写它的compare方法。

/*
 * 如果element1小于element2,就返回一个负值; 
 * 如果element1大于element2,就返回一个正值; 
 * 若两者相等,则返回0
 */
public int compare(T elementl, T element2)
  • Java提供了包含compare()equals()两个方法的Comparator接口
    • compare()方法用来给两个输入参数排序,返回负数、0、正数表明第一个参数是小于、等于、大于第二个参数。
    • equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator,并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true
// GeometricObjectComparator.java
import java.util.Comparator;

public class GeometricObjectComparator
    implements Comparator<GeometricObject>, java.io.Serializable
{
    @Override
    public int compare(GeometricObject o1, GeometricObject o2)
    {
        double area1 = o1.getArea();
        double area2 = o2.getArea();

        if (area1 < area2)
            return -1;
        else if (area1 == area2)
            return 0;
        else
            return 1;
  }
}
import java.util.Comparator;

public class TestComparator
{
    public static void main(String[] args)
    {
        GeometricObject g1 = new Rectangle(5, 5);
        GeometricObject g2 = new Circle(5);

        GeometricObject g = max(g1, g2, new GeometricObjectComparator());

        System.out.println("The area of the larger object is " + g.getArea());
    }

    public static GeometricObject max(GeometricObject g1, GeometricObject g2, Comparator<GeometricObject> c)
    {
        if (c.compare(g1, g2) > 0)
            return g1;
        else
            return g2;
    }
}
posted @ 2021-03-10 21:53  chenzufeng  阅读(281)  评论(0编辑  收藏  举报