(RESOLVIDO)HashMap - Retornar índice do maior valor
16 respostas
Michel_M
Bom dia pessoal…
Estou com uma duvida aqui, espero que vcs possam me ajudar. Eu tenho um hashMap e nele eu quero retornar o indice do maior valor dele.
Ex:
HashMap<Integer,Integer> list = new HashMap<Integer,Integer>();// Primeira Indice e depois o valor
list.put(1,10);
list.put(2,20); // Maior valor
list.put(4,5);
list.put(8,11);
Teria que retornar então indice 2.
Vcs sabem como eu posso realizar isto?
Creio que precisa usar o iterator, iterar sobre o mesmo e assim ter acesso ao cruzamento das informações.
lele_vader
Usa um treemap que é uma coleção ordenada.
Para isso vai ter que implementar hashcode e equals lá no valor se for um tipo criado por você.
Acredito que vai ter que fazer um comparator também para comparar os valor, pois o treemap acho que é ordenado pela chave.
Michel_M
Pelo que eu entendi vc quer que eu compare um por um, ai ache o maior e retorne o indice. Mais assim eu vou perder uma performance muito grande. O que vc acha de ordenar e assim pegar a primeira posição??.. mais eu não achei uma maneira de pegar a primeira posição.
drsmachado
Pelo que eu entendi vc quer que eu compare um por um, ai ache o maior e retorne o indice. Mais assim eu vou perder uma performance muito grande. O que vc acha de ordenar e assim pegar a primeira posição??.. mais eu não achei uma maneira de pegar a primeira posição.
HashMap não garante ordenação, meu camarada.
Se pretende usar este tipo de coleção, precisa iterar sobre. A sugestão do lele_vader é bacana, vai te dar um trabalho, mas é mais adequada.
Daí você pode usar get(0) e vai trazer o seu valor.
Porém, como eu disse o treemap ordena por default pelas chaves, então provavelmente se você instanciar assim com o exemplo que você deu ele vai trazer o valor 1, pois é a primeira chave.
Daí você implementa um comparator que pega os seus valores e retorna o maior ao invés do menor
Daí você pode usar get(0) e vai trazer o seu valor.
Porém, como eu disse o treemap ordena por default pelas chaves, então provavelmente se você instanciar assim com o exemplo que você deu ele vai trazer o valor 1, pois é a primeira chave.
Daí você implementa um comparator que pega os seus valores e retorna o maior ao invés do menor
Assim tu tem o maior valor e a chave correspondente, sem maiores problemas.
lele_vader
E não pode ser o contrário ?
O valor como chave e a id como valor ?
Porque senão ou você itera tudo e checa ou implementa o seu sortedMap, que é a interface que a coleções de mapa ordenado usam
igual aqui
E
entanglement
Pode-se inverter um map se ele representar uma relação biunívoca (ou seja, para cada índice corresponde um valor e vice-versa).
Se esse map for inversível não há problemas em usar a solução do Nel.
Michel_M
entanglement:
Pode-se inverter um map se ele representar uma relação biunívoca (ou seja, para cada índice corresponde um valor e vice-versa).
Se esse map for inversível não há problemas em usar a solução do Nel.
Isso msm como indice vai ser o ID do registro ele não vai repetir, mais o valor sim vai poder ser repetido até pq vai ser uma data.
E
entanglement
Pelo que imagino, você não quer então 1 índice e sim N índices correspondendo ao maior valor, que se repete.
Então o código que passei teria de ser um pouco mais complicado, porque teria de acumular vários índices, correspondentes ao valor máximo, em uma lista.
nel
entanglement:
Pelo que imagino, você não quer então 1 índice e sim N índices correspondendo ao maior valor, que se repete.
Então o código que passei teria de ser um pouco mais complicado, porque teria de acumular vários índices, correspondentes ao valor máximo, em uma lista.
Exatamente. Então não há muita saída (ou talvez seja a única) além de percorrer o map item a item. Se você precisa do maior valor, mesmo que ele repita N vezes e possa ser qualquer índice, o que eu disse acima serve, caso contrário, precisa de uma lógica melhor elaborada.
pmlm
Uma opção é guardares dois maps.
Um “normal” e outro invertido, onde guardas valor - lista de chaves.