Domanda

Ho il seguente codice, che divide un vettore in un vettore stringa (da usare come chiave) e un numero intero alla fine (da usare come valore).

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

La TreeMap in questione è costruita usando un comparatore con il seguente metodo, che impone un ordinamento lessicografico indipendente dal caso che tiene conto anche della lunghezza (i vettori più lunghi sono sempre " maggiore " rispetto a quelli più brevi ).

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;
    }

Ora, per il problema ... nonostante abbia 8 voci nel file di testo da cui si sta leggendo, la mappa ottiene solo fino a 2 voci. Una volta immessa una voce (chiave), rimane, ma il valore cambia ad ogni iterazione del processo di scansione (ogni volta che legge un nuovo vettore da una riga nel file). Elimina tutte le altre chiavi tranne le due.

È un problema con il mio comparatore? Oppure TreeMap sta facendo qualcosa che non capisco con put ()?

È stato utile?

Soluzione

Rispondi Non rispondi alla domanda, con ma un paio di punti minori oltre al tuo codice:

  1. Non dovresti fare il confronto Per due volte; confrontare una volta e assegnare il risultato a sgn; quindi rompi if! = 0
  2. L'altro continua è ridondante.
  3. Non devi confrontare per -1 o 1, ma < 0 o > 0; molti metodi compareTo restituiscono in base a (x1-x2), che può fornire qualsiasi numero negativo o positivo.

EDIT: Doh! E, naturalmente, il ritorno per String.compareToIgnoreCase () è uno di quei (3) comparatori. Come l'altra risposta ha pubblicato contemporaneamente alla mia, quella probabilmente sarà la causa del tuo errore.

EDIT2: la dichiarazione di apertura corretta per riflettere la domanda ha effettivamente avuto risposta.

Altri suggerimenti

Non so se questa sia la causa del tuo problema, ma le funzioni di confronto in Java di solito restituiscono negativo o positivo o 0, non necessariamente 1 o -1.

Sono disposto a scommettere che stai ottenendo in qualche modo un valore diverso da compareToIgnoreCase, ma perché non è 1 o -1 che passi, e finisci per restituire 0 anche se gli array sono identici in lunghezza e non contenuti. Prova a controllare contro & Gt; 0 e & Lt; 0

Inoltre, puoi organizzare meglio questo codice. Ad esempio, fai un confronto, salva i risultati, quindi attiva i risultati. In questo modo potresti fare due paragoni costosi per niente.

In realtà, il trucco potrebbe essere che ho letto male la documentazione effettivamente fornita da compareTo () che riporterà una volta testata.

Aaand, ecco. Grazie gente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top