我想在java中有一个可以迭代它的有序集合。从我读到的是,PriorityQueue是我需要的东西但是我无法弄清楚如何以排序的方式检索元素......
我做了这个测试示例:
Main.java
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) {
PriorityQueue<Object> queue=new PriorityQueue<Object>();
Object o1=new Class1("o1");
Object o2=new Class2("o2");
Object o3=new Class1("o3");
Object o4=new Class1("o4");
Object o5=new Class2("o5");
Object o6=new Class2("o6");
Object o7=new Class1("o7");
Object o8=new Class2("o8");
Object o9=new Class1("o9");
Object o0=new Class1("o0");
queue.add(o7);
queue.add(o4);
queue.add(o3);
queue.add(o8);
queue.add(o5);
queue.add(o1);
queue.add(o2);
queue.add(o9);
queue.add(o0);
queue.add(o6);
for (Object object : queue) {
System.out.println(object);
}
}
}
Class1.java:
public class Class1 implements Comparable<Object>{
String name;
public Class1(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Class1 [name=" + name + "]";
}
@Override
public int compareTo(Object o) {
return (o instanceof Class1)?compareTo((Class1)o):compareTo((Class2)o);
}
public int compareTo(Class1 o){
return name.compareTo(o.name);
}
public int compareTo(Class2 o){
return name.compareTo(o.name2);
}
}
Class2.java:
public class Class2 implements Comparable<Object>{
String name2;
public Class2(String name) {
super();
this.name2 = name;
}
@Override
public String toString() {
return "Class2 [name=" + name2 + "]";
}
@Override
public int compareTo(Object o) {
return (o instanceof Class1)?compareTo((Class1)o):compareTo((Class2)o);
}
public int compareTo(Class1 o){
return name2.compareTo(o.name);
}
public int compareTo(Class2 o){
return name2.compareTo(o.name2);
}
}
返回:
Class1 [name=o0]
Class1 [name=o1]
Class2 [name=o2]
Class2 [name=o5]
Class2 [name=o6]
Class1 [name=o4]
Class1 [name=o3]
Class1 [name=o9]
Class2 [name=o8]
Class1 [name=o7]
我需要做什么来对这个集合进行有序的迭代?
答案 0 :(得分:1)
只有在将它们出列时,才会按排序顺序将元素返回给您。在没有出队的情况下迭代队列时,顺序是优先级队列实现的内部。
使用下面的代码替换循环,以正确的顺序为您提供数据:
Object last;
while ((last = queue.poll()) != null) {
System.out.println(last);
}
由于保证以正确的顺序发生出队,因此产生以下输出:
Class1 [name=o0]
Class1 [name=o1]
Class2 [name=o2]
Class1 [name=o3]
Class1 [name=o4]
Class2 [name=o5]
Class2 [name=o6]
Class1 [name=o7]
Class2 [name=o8]
Class1 [name=o9]
答案 1 :(得分:1)
在遍历迭代器时,PriorityQueue
不保证对其元素的任何排序。它只保证第一个元素是“最小的”元素。由于它是一个队列,它应该被用作您轮询的临时集合。
相反,正如@BenjaminGruenbaum评论的那样,您可以使用TreeSet
来保证迭代器将返回元素顺序。
另一种选择是在需要对List
进行排序时使用Collections.sort()
对其进行排序。
P.S。看起来你可以使用Class1和Class2的一些继承,因为它可以简化你的很多代码 - 你只需要toString()
方法,因为它们是唯一不同的方法。
答案 2 :(得分:0)
优先级队列实际上不是一个已排序的容器;它更像是一个堆栈或队列,按排序顺序弹出元素。您将需要使用实现SortedSet
的容器。