4 Stimmen

Übergeben von 2 Generika in der Priority Queue

Ich möchte zwei Dinge in meiner Prioritätswarteschlange behalten ... ein ist eine Zahl und das andere ist der Preis. d.h. Ich möchte folgendes tun:

PriorityQueue q=new PriorityQueue();

Kosten ist eine andere Klasse, die ich habe:

class Cost implements Comparable
{
  String name;
  double cost;

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

Außerdem möchte ich nur basierend auf den Kosten Vergleiche durchführen ... aber ich möchte auch einen integer-Identifier zusammen mit den Kosten weitergeben ... gibt es eine Möglichkeit, dies zu erreichen?

Ich muss Kosten basierend auf der ID abrufen ... daher verwende ich dafür einen Hash map. Wenn ich ein ID-Feld in den Kosten verwende ... möchte ich die gesamte Kosteninstanz basierend auf diesem ID-Feld abrufen ... ist das möglich ... wenn ja, wie?

Ich bin ein Anfänger in der Java-Programmierung. Kann mir jemand bitte einen Ausweg vorschlagen?

1voto

Amit Deshpande Punkte 18721

Ändern Sie Ihre Cost Klasse

public class Cost implements Comparable {
    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();

    }
}

Dann können Sie einfach PriorityQueue von Const deklarieren

PriorityQueue q=new PriorityQueue();

Jetzt, wenn Sie basierend auf der id nach Cost suchen möchten, können Sie Folgendes tun

PriorityQueue queue = new PriorityQueue();
    queue.add(new Cost(1, "one", 1));
    queue.add(new Cost(2, "two", 2));
    int id = 2;// Id, das gefunden werden soll
    for (Cost cost : queue) {
        if (cost.getId() == 2) {
            System.out.println(cost);
        }
    }

0voto

Louis Wasserman Punkte 181854

Das Cost-Objekt ist ein guter Anfang. Erstellen Sie ein Objekt, das sowohl eine Ganzzahl als auch eine Cost enthält, und legen Sie diese in die Prioritätswarteschlange. Oder fügen Sie ein Ganzzahlfeld zur Cost-Klasse selbst hinzu.

0voto

Yogendra Singh Punkte 33327

Sie möchten Ihren Integer und die Kosten möglicherweise wie folgt in einem Map/HashMap verpacken:

   PriorityQueue> q = new PriorityQueue>();

Jetzt können Sie ein HashMap-Objekt erstellen und Ihre beiden Objekte darin platzieren, bevor Sie sie in die Warteschlange einfügen.

Sie möchten außerdem eine benutzerdefinierte Wrapper-Klasse erstellen z. B. CostNumber, die Integer und Kosten als zwei Member-Variablen enthält. Sobald dies erledigt ist, können Sie dieses neue Objekt in der Warteschlange verwenden.

0voto

Vikdor Punkte 23460

Da PriorityQueue nur ein Objekt speichert, müssen Sie eine der folgenden Optionen wählen:

  • Erstellen Sie eine Klasse, die sowohl das Ganzzahl- als auch das Kostenobjekt enthält, falls Ganzzahl und Kosten nicht miteinander verbunden sind.
  • Fügen Sie das Ganzzahl-Attribut als weiteres Element der Kostenklasse hinzu, falls sie miteinander verbunden sind.

Ich möchte auch nur Vergleiche basierend auf Kosten durchführen... aber ich möchte auch eine Ganzzahl-Kennung zusammen mit den Kosten übergeben... gibt es eine Möglichkeit, dies zu erreichen?

Warum würden Sie etwas an compareTo übergeben wollen, das Sie während des Vergleichs nicht verwenden werden? In jedem Fall kann die Signatur dieser Methode nicht geändert werden, wenn Sie das Comparator-Framework nutzen möchten. Sie können diese Ganzzahl-Kennung zu Ihrer Kostenklasse selbst als weiteres Element hinzufügen und sie somit während der Ausführung der compareTo-Methode verfügbar machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X