2

クラス Halfedge があるプロジェクトがあります (olny .class ファイルなので、変更する方法はありません)。PriorityQueue を作成したい。どちらの要素が大きいかを判断するには、Halfedge クラス内のフィールドだけでなく、コードで作成した HashMap も必要です。

問題は、Halfedge に固有の Comparator クラスを定義するときに、パラメーターを含めることができないということです。

私の質問は、外部パラメーターを使用して Halfedge クラスのコンパレーター クラスを実装するにはどうすればよいですか? (または単に、その PriorityQueue をどのように構築すればよいでしょうか)

どうもありがとう!

4

2 に答える 2

4

次のコードを見てください。

public class HalfedgeComparator
        implements Comparator<Halfedge>;
{

  Object param1 = null;

  public HalfedgeComparator (Object param1) {
    this.param1= param1;
  }

  public int compare(Halfedge item1, Halfedge item2)
  {
    return ...;
     //your logic here where you can use the param1 passed in the constructor
  }
}

クライアントコードは次のようになります。

Collections.sort(yourListHere, new HalfedgeComparator(yourExternalParamHere));
于 2012-11-12T23:10:19.467 に答える
4

final匿名の内部クラスから変数にアクセスでき、必要に応じてこれを使用できることに注意してください。

簡単な例を次に示します。

public static void main(String args[]) {
    final Map<String,Integer> map = new HashMap<>();
    String s1 = "a";
    String s2 = "b";
    String s3 = "c";
    map.put(s2, 1);
    map.put(s1, 2);
    map.put(s3, 3);
    PriorityQueue<String> pq = new PriorityQueue<>(3, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return map.get(o1).compareTo(map.get(o2));
        }
    });
    pq.add(s1);
    pq.add(s2);
    pq.add(s3);
    while (pq.isEmpty() == false) 
        System.out.println(pq.poll());
}

Comparatorオブジェクトがmapローカル変数を使用していることに注意してください。変数mapが宣言されているため、これを行うことができますfinal


別の方法は、 (匿名の内部クラスでない場合)Mapのコンストラクターでへの参照を渡し、それをフィールドとして格納し、後で使用することです。Comparator


いずれの場合もMap、要素が挿入された後、一部の要素のデータが変更されないようにする必要があります。変更されたPriorityQueue場合、データ構造が破損し、未定義の動作が発生します。

于 2012-11-12T23:17:14.957 に答える