迭代器与比较器
迭代器
每种合集都是可迭代的(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的一些类,比如String
、Date
、Calendar
、BigInteger
、BigDecimal
以及所有基本类型的数字包装类都实现了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;
}
}