Pregunta

Tengo el siguiente código, que divide un Vector en un vector de cadena (para usar como clave) y un número entero al final (para usar como valor).

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

El TreeMap en cuestión se construye utilizando un Comparador con el siguiente método, que impone un orden lexicográfico independiente de mayúsculas y minúsculas que también tiene en cuenta la longitud (los vectores más largos siempre son & "; mayores &"; que los más cortos ).

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

Ahora, para el problema ... a pesar de tener 8 entradas en el archivo de texto del que se está leyendo, el mapa solo tiene hasta 2 entradas. Una vez que se ingresa una entrada (clave), permanece, pero el VALOR cambia con cada iteración del proceso de escaneo (cada vez que se lee en un nuevo vector desde una línea en el archivo). Lanza todas las otras claves excepto las dos.

¿Es este un problema con mi comparador? ¿O está haciendo TreeMap algo que no entiendo con put ()?

¿Fue útil?

Solución

Respondiendo Sin responder la pregunta, con pero un par de puntos menores además de su código:

  1. No debe hacer la comparación dos veces; compare una vez y asigne el resultado a sgn; entonces rompa si! = 0
  2. Su otra continuación es redundante.
  3. No debe comparar para -1 o 1, sino < 0 o > 0; muchos métodos compareTo regresan en función de (x1-x2), lo que puede dar cualquier número negativo o positivo.

EDITAR: Doh! Y, por supuesto, el rendimiento de String.compareToIgnoreCase () es uno de esos (3) comparadores. Como la otra respuesta publicada al mismo tiempo que la mía señaló, esa será probablemente la causa de su error.

EDIT2: se respondió la declaración de apertura corregida para reflejar la pregunta.

Otros consejos

No sé si esta es la causa de su problema, pero las funciones de comparación en Java generalmente devuelven negativo o positivo o 0, no necesariamente 1 o -1.

Estoy dispuesto a apostar que de alguna manera está obteniendo un valor distinto de cero de compareToIgnoreCase, pero debido a que no es 1 o -1, se cae y termina devolviendo 0 a pesar de que las matrices son idénticas en longitud y no contenido. Intente verificar con & Gt; 0 y & Lt; 0

Además, puede organizar mejor este código. Por ejemplo, haga una comparación, guarde los resultados y luego enciéndalos. De esta manera, puede hacer dos comparaciones costosas por nada.

En realidad, el truco puede ser que haya leído mal qué documentación de compareTo () realmente dijo ... informará una vez probado.

Aa, eso fue todo. Gracias gente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top