Frage

I habe den folgenden Code, der einen Vektor in einen String Vektor aufspaltet (als Schlüssel zu verwenden) und eine ganze Zahl am Ende (als Wert verwenden).

payoffs.put(new Vector<String>(keyAndOutput.subList(0, keyAndOutput.size() - 1)), Integer.parseInt(keyAndOutput.lastElement()));

Die TreeMap in Frage konstruiert ist ein Komparator mit dem folgenden Verfahren verwendet wird, das eine lexikographische, Fall unabhängig Ordnung auferlegt, die auch Länge berücksichtigt (längere Vektoren sind immer „größer“ als kürzere).

public int compare(Vector<String> arg0, Vector<String> arg1) {
        int sgn = 0;
        if (arg0.size() > arg1.size()) {
            return 1;
        } else if (arg0.size() < arg1.size()) {
            return -1;
        }
        for (int i = 0; i < arg0.size(); i++) {
            if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == 1) {
                sgn = 1;
                break;
            } else if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == -1) {
                sgn = -1;
                break;
            } else {
                continue;
            }
        }
        return sgn;
    }

Nun, für das Problem ... trotz 8 Einträge in der Textdatei wird diese aus gelesen wird, wird die Karte immer nur zwei Einträge. Sobald ein Eintrag (Schlüssel) eingegeben wird, es bleibt, aber der Wert ändert sich mit jeder Iteration des Abtastprozesses (jedesmal, wenn es von einer Zeile in der Datei in einem neuen Vektor liest). Es wirft alle anderen Tasten mit Ausnahme der beiden.

Ist das ein Problem mit meinem Komparator? Oder ist das TreeMap etwas zu tun, ich verstehe nicht, mit put ()?

War es hilfreich?

Lösung

Die Beantwortung antwortet nicht die Frage, mit und ein paar kleine Punkte neben über Ihren Code:

  1. Sie sollten die compareTo zweimal nicht tun; Vergleichen einmal und weist das Ergebnis zu SGN; dann brechen, wenn! = 0
  2. Sie sonst weiterhin ist überflüssig.
  3. Sie sollten nicht vergleichen, für -1 oder 1, aber <0 oder> 0; viele compareTo Methoden geben auf Basis von (x1-x2), die jedes negative oder positive Zahl geben kann.

EDIT: Doh! Und natürlich ist die Rücksendung für String.compareToIgnoreCase () einer jener (3) Komparatoren. Wie die andere Antwort zur gleichen Zeit geschrieben wie ich darauf hingewiesen, dass wird die Ursache des Fehlers wahrscheinlich sein.

EDIT2. Korrigierte Eröffnungsplädoyer Frage zu reflektieren tatsächlich beantwortet

Andere Tipps

Ich weiß nicht, ob dies die Ursache des Problems ist, aber vergleiche Funktionen in Java in der Regel zurückgeben negativ oder positiv oder 0 ist, nicht notwendigerweise 1 oder -1.

Ich bin bereit zu wetten, dass Sie irgendwie sind einen Wert ungleich Null aus compareToIgnoreCase bekommen, sondern weil es nicht 1 ist oder -1 Sie fallen durch, und am Ende 0 zurückkehren, obwohl die Anordnungen in der Länge und nicht inhaltlich identisch sind. Versuchen Prüfung gegen> 0 und <0

Auch können Sie diesen Code besser organisieren. Zum Beispiel führen Sie einen Vergleich, um die Ergebnisse zu speichern, wechseln Sie dann auf die Ergebnisse. Auf diese Weise können zwei umsonst vergleicht tun kann teuer.

Tatsächlich kann in der Tat der Trick sein, dass ich falsch verstanden, welche Unterlagen für compareTo () tatsächlich gesagt ... berichtet einmal getestet.

aaand, das war es. Dank Menschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top