4

プライオリティ キューに 2 つのものを保持したいと考えています... 1 つは数値で、もう 1 つはコストです。つまり、私は次のことをしたい:

PriorityQueue<Integer, Cost> q=new PriorityQueue<Integer, Cost>();

コストは私が持っている別のクラスです:

class Cost implements Comparable<Cost>
{
  String name;
  double cost;

  @Override
  public int compareTo(Cost s)
  {
    return Double.compare(cost, s.cost);
  }
 }

また、コストのみに基づいて比較を実行したい...しかし、コストとともに整数識別子を渡したい...これを達成する方法はありますか?

ID に基づいてコストを取得する必要があるため、ハッシュ マップを使用しています。コストで id フィールドを使用する場合...その id フィールドに基づいてコスト インスタンス全体を取得したい...それは可能ですか...はい、どうすればよいですか?

私はJavaプログラミングの初心者です。誰かが何らかの方法を提案できますか?

4

4 に答える 4

1

Costクラスを変更する

public class Cost implements Comparable<Cost> {
    String name;
    double cost;
    int id;

    public Cost(int id, String name, double cost) {
        this.id = id;
        this.name = name;
        this.cost = cost;
    }

    @Override
    public int compareTo(Cost s) {
        return Double.compare(cost, s.cost);
    }

    public int getId() {
        return this.id;
    }

    @Override
    public String toString() {
        return new StringBuilder().append("id : ").append(id).append(
                " name: ").append(name).append(" cost :").append(cost)
                .toString();

    }
}

PriorityQueue次に、単に宣言できますConst

PriorityQueue<Cost> q=new PriorityQueue<Cost>();

Costに基づいて検索したい場合は、以下でid実行できます

PriorityQueue<Cost> queue = new PriorityQueue<Cost>();
    queue.add(new Cost(1, "one", 1));
    queue.add(new Cost(2, "two", 2));
    int id = 2;// Id to be found
    for (Cost cost : queue) {
        if (cost.getId() == 2) {
            System.out.println(cost);
        }
    } 
于 2012-10-27T05:49:15.160 に答える
0

オブジェクトはCost良いスタートです。整数と a の両方を含むオブジェクトを作成し、それらを優先キューにCost入れます。または、整数フィールドをクラス自体に追加します。Cost

于 2012-10-27T05:31:47.207 に答える
0

Map/HashMap以下のように、整数とコストを a でラップすることができます。

   PriorityQueue<Map<Integer, Cost>> q = new PriorityQueue<Map<Integer, Cost>>();

これで、HashMap オブジェクトを作成し、キューに入れる前に 2 つのオブジェクトをその中に入れることができます。

また、たとえばInteger と Cost を 2 つのメンバ変数として持つカスタム ラッパー クラスを作成したいとします。CostNumber完了したら、その新しいオブジェクトをキューで使用できます。

于 2012-10-27T05:32:35.690 に答える
0

PriorityQueue は単一のオブジェクトを格納するため、次のいずれかを実行する必要があります。

  • integer と cost オブジェクトの両方を含むクラスを作成します (integer と cost が関連していない場合)。
  • それらが関連している場合、Cost クラスの別のメンバーとして整数属性をプッシュします。

また、コストのみに基づいて比較を実行したい...しかし、コストとともに整数識別子を渡したい...これを達成する方法はありますか?

比較中に使用しないものをcompareToに渡したいのはなぜですか?いずれにせよ、Comparator フレームワークを利用する場合、このメソッドのシグネチャを変更することはできません。その整数識別子を別のメンバーとして Cost クラス自体に追加して、compareTo メソッドの実行中に使用できるようにすることができます。

于 2012-10-27T05:35:05.157 に答える