import java.util.*;
public class PriorityQueueTest {
public static void main(String[]args)
{
PriorityQueue<GregorianCalendar> pq=new PriorityQueue<GregorianCalendar>();
pq.add(new GregorianCalendar(1906,Calendar.DECEMBER,9));
pq.add(new GregorianCalendar(1815,Calendar.DECEMBER,10));
pq.add(new GregorianCalendar(1903,Calendar.DECEMBER,3));
pq.add(new GregorianCalendar(1910,Calendar.DECEMBER,22));
System.out.println("Iterating over elements");
for(GregorianCalendar date:pq)
System.out.println(date.get(Calendar.YEAR));
                System.out.println("Removing elments");
System.out.println(pq.remove().get(Calendar.YEAR));

}}
结果:
Iterating over elements
1815
1906
1903
1910
Removing elments
1815为什么会是这个结果呢,书上说的删除总是删除元素中优先级最小的那个元素,而怎么也不会是1815啊,还有他的遍历顺序为什么是那个顺序呢,不明白,请教。

解决方案 »

  1.   

    优先级队列 删除时就是删除最小的元素
    1815 就是最小的啊 GregorianCalendar比较的就是时间早的小
      

  2.   

    他的输出顺序为什么是这个呢Iterating over elements
    1815
    1906
    1903
    1910
      

  3.   

    这个类的内部存储并不一定是有序的列表,
    所以,这个类的iterator方法有声明:
    不保证返回的对象有任何特定的顺序。
    iteratorpublic Iterator<E> iterator()    Returns an iterator over the elements in this queue. The iterator does not return the elements in any particular order.    Specified by:
            iterator in interface Iterable<E>
        Specified by:
            iterator in interface Collection<E>
        Specified by:
            iterator in class AbstractCollection<E>    Returns:
            an iterator over the elements in this queue.

    这个类排序的机制基于Comparator,最小的排在前面:
    The head of this queue is the least element with respect to the specified ordering.
      

  4.   

    我在HashMap也遇到同样的问题,麻烦帮忙解释下。
    import java.util.*;
    public class MapTest {
    public static void main(String[]args)
    {
    Map<String,Employee>staff=new HashMap<String,Employee>(); 
    staff.put("129", new Employee("Cary Cooper"));
    staff.put("144", new Employee("Amy lee"));
      staff.put("112", new Employee("France"));
    staff.put("149", new Employee("Harry Hacker"));
    System.out.println(staff);
    }
    }
    class Employee
    {
    private double salary;
    private String name;
    public Employee(String n)
    {
    this.name=n;
    salary=0;
    }
    public String toString()
    {
    return "[name="+name+",salary="+salary+"]";
    }
    }
    结果:
    {144=[name=Amy lee,salary=0.0], 112=[name=France,salary=0.0], 149=[name=Harry Hacker,salary=0.0], 129=[name=Cary Cooper,salary=0.0]}同样HashMap不对元素排列,可输出结果为什么老是这个呢,为什么啊?我真的不明白。
      

  5.   

    我觉得这就是数据结构书里讲的算法稳定性,
    虽然内部并不保证以任何特定的顺序进行iterater,但并不等同于“相同的数据乱序”,
    这只能说明,这个类对相同的数据序列,内部组织数据的方式是稳定的,但并不是有序的。