1

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]

このコレクションを並べ替えて反復処理するにはどうすればよいですか?

4

3 に答える 3

2

要素は、デキュー時にのみソートされた順序で返されます。デキューせずにキューを反復する場合、順序は優先度キューの実装の内部にあります。

ループを以下のコードに置き換えると、正しい順序でデータが得られます。

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]

ここにideoneのデモがあります。

于 2013-05-24T10:25:42.117 に答える
1

APriorityQueueは、反復子を通過するときの要素の順序を保証しません。最初の要素が「最小」であることを保証するだけです。これはキューであるため、ポーリング元の一時的なコレクションとして使用されることになっています。

代わりに、@BenjaminGruenbaum がコメントしたようTreeSetに、イテレータが要素の順序を返すことを保証する a を使用できます。

別のオプションは、ソートする必要があるときにCollections.sort()any を使用してソートすることです。List

PS多くのコードを簡素化できるため、Class1とClass2でいくつかの継承を使用できるように見えます-toString()異なるのはメソッドだけであるため、メソッドのみが必要です。

于 2013-05-24T10:32:09.873 に答える