Pergunta

Eu tenho o seguinte código, que divide um vetor em um vetor de strings (para uso como uma chave) e um inteiro no final (para uso como valor).

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

O TreeMap em questão é construído usando um comparador com o seguinte método, que impõe um, caso ordenação independente lexicográfica que também leva em conta o comprimento (vetores mais longos são sempre "maior" do que os mais curtos).

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

Agora, para o problema ... apesar de ter 8 entradas no arquivo de texto isso está sendo lidos, o mapa sempre apenas recebe até 2 entradas. Uma vez que uma entrada (key) é inserido, ele permanece, mas o valor muda a cada iteração do processo de digitalização (cada vez que lê em um novo vetor de uma linha no arquivo). Ele joga fora todas as outras chaves, exceto para os dois.

Este é um problema com o meu comparador? Ou é o TreeMap fazendo algo que eu não entendo com put ()?

Foi útil?

Solução

Respondendo Não responder a questão, com e Pontos de um par menores além sobre o seu código:

  1. Você não deve fazer o compareTo duas vezes; comparar uma vez e atribuir o resultado para SGN; em seguida, quebrar se! = 0
  2. Seu senão continuar é redundante.
  3. Você não deve comparar para -1 ou 1, mas <0 ou> 0; muitos métodos compareTo voltar com base em (x1-x2), o que pode dar qualquer negativo ou número positivo.

EDIT: Doh! E, claro, o retorno para String.compareToIgnoreCase () é um desses (3) comparadores. Como a outra resposta postada, ao mesmo tempo que o meu apontou, que provavelmente será a causa do seu erro.

EDIT2:. Declaração de abertura corrigido para refletir questão foi realmente respondeu

Outras dicas

Eu não sei se esta é a causa do seu problema, mas comparar funções em Java geralmente retornam negativo ou positivo ou 0, não necessariamente 1 ou -1.

Estou disposto a apostar que você está de alguma forma obter um valor diferente de zero de compareToIgnoreCase, mas porque não é 1 ou -1 você cair, e acabam retornando 0, embora as matrizes são idênticos em tamanho e não de conteúdo. Tente verificar contra> 0 e <0

Além disso, você pode organizar este código melhor. Por exemplo, fazer uma comparação, salvar os resultados, em seguida, mudar os resultados. Desta forma, você pode estar fazendo dois caro compara para nada.

Na verdade, o truque pode ser de fato que eu descaracterizou o que documentação para compareTo () realmente disse ... relatará uma vez testado.

Aaand, era isso. Obrigado pessoas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top