下面这个程序是可以编译运行的.此程序演示了接口Iterator的运用.
这个程序的一些代码我不能理解,希望大侠给指点指点(问题已在程序中注明).谢谢了! 
import java.util.Iterator;
import java.util.Collection;
import java.util.ArrayList;class Chart implements Comparable {
  public int number;
  public String name;
  public long scale;  public Chart(int number,String name,long scale){
    this.number=number;
    this.name=name;
    this.scale=scale;
  }
  public int compareTo(Object o){
    Chart other=(Chart)o; 
    //return name.compareTo(other.name);                            //根据name来排序
    return (scale<other.scale? 1:(scale==other.scale? 0:-1));     //根据scale来排序
    //return (number<other.number? 1:(scale==other.number? 0:-1));  //根据number来排序
                                                                   //设置返回值可以实现逆序排序
  }
  public String toString(){
    return number+"  "+name+"  "+"  1:"+scale;
  }
}class IteratorDemo{
  public static void showContainer(Collection c){
    Chart achart;
    Iterator I=c.iterator();      //疑问??(Iterator是接口为什么可以实例化)
    while(I.hasNext()){
achart=(Chart)I.next();
        System.out.println(achart.toString());
    }
  } public static void main(String args[]) {
// Construct the container
  ArrayList charts = new ArrayList();
// Insert some Data objects
  charts.add(new Chart(11013, "Morehead City Hrbr ", 12500));
  charts.add(new Chart(11552, "Neuse River        ", 40000));
  charts.add(new Chart(11428, "Dry Tortugas       ", 30000));
  charts.add(new Chart(11420, "Havana to Tampa Bay", 470940));
  charts.add(new Chart(25641, "Virgin Islands     ", 100000));
  charts.add(new Chart(26341, "Bermuda Islands    ", 50000));
  System.out.println("\nCharts shown by an Iterator object");
  showContainer(charts);//疑问??(showContainer(Collection c)为什么可以接受参数:charts)
  Iterator I=charts.iterator();
  if(I.hasNext()){
    Chart c=(Chart)I.next();
    I.remove();
  }
  System.out.println("\nAfter removing first object");
  showContainer(charts);
  I=charts.iterator();
  while(I.hasNext()){
    I.next();
    I.remove();
  }
  System.out.print("\nAfter removing all objects");
  System.out.println("Container size= "+charts.size());
  }
}

解决方案 »

  1.   

    Collection 类 的 iterator() 方法:
       
        iterator()返回在此 collection 的元素上进行迭代的迭代器。关于元素返回的顺序没有任何保证(除非此 collection 是某个能提供保证顺序的类实例)。 返回:
    在此 collection 的元素上进行迭代的 Iterator
      

  2.   

    Iterator I=c.iterator();      //疑问??(Iterator是接口为什么可以实例化)
    List l = new ArrayList();//这样写难道是实例化了List接口吗?当然不是你可以System.out.println(I);
    看看他的实际类型。父类的所有子类都可以被称作是父类的类型。也就是说一个方法可以返回他声明类型的子类。在集合库中,HashMap,HashSet,ArrayList,Vector等等他们的iterator方法返回的都是Iterator的实现类,这样,我们就看不到他们,也不需要关心他们,也就保持了API的整洁。
      

  3.   

    showContainer(charts);//疑问??(showContainer(Collection c)为什么可以接受参数:charts这是多态性的基础。
    ArrayList arrayList = new ArrayList();
    如果你操纵实际类型,那么客户程序员就只能使用ArrayList中的实现
    List list = new ArrayList();
    如果你操纵接口,那么你就不需要关心list的实际类型,只要知道,他实现了List规定的所有接口就行了。比如你写了一个库提供一个方法
    public List getList(){
        return new ArrayList();
    }
    客户程序员使用的时候,他并不需要关心实际类型。突然有一天,你发现ArrayList并不能满足要求了,想把实现改为Vector,你可以改成
    public List getList(){
        return new Vector();
    }
    但是客户程序员所看到的API并没变,仍然是一个List类型。所以客户程序员不需要修改自己的程序。
      

  4.   

    ArrayList继承自List
    List又继承自Collection所以可以说ArrayList可以是一个Collection.
      

  5.   

    showContainer(Collection c)
    对外的承诺是,只要你实现了Collection接口,我就可以为你服务。