Ir para conteúdo
  • 0

Eu dnv.. Dúvidas de ranking


Ducky

Pergunta

Oi amigos, eis eu novamente aqui.. Agora minha dúvida é de ranking.. ou seja top 5, como exemplo.. Eu estava vendo esse tutorial porém tem que ter mais de 10 valores..

 

Dúvida:

 

1) Como pego em uma lista de Hashmap os top 5 que tem mais INT..?

 

 

 public static HashMap<String, Integer> vezes = new HashMap<>();

 

2) Como faço para pegar o TOP 1 dessa lista e fazer x coisa com esse TOP 1?

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

Cara, a base disso tudo é feita no TreeMap.

Dei uma pesquisada aqui, talvez isso te ajude:

https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java

Não ajudou.

Quero um comentado para eu entender, não que apenas jogue o código de qualquer jeito

Link para o comentário
Compartilhar em outros sites

 

basicamente você quer um código pronto... mas não...

 

da uma olhada nessa classe>

https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

 

dps é só chamar esse método:

Collections.reverseOrder();

 

 

Esse método ordena as Keys, ele quer ordenar os Valores, acho eu.

 

@Topic

 

Bom, como eu tinha dito anteriormente, você precisará utilizar um TreeMap, que é basicamente uma classe que tem as Keys ordenadas alfabeticamente por natural,

e que também funciona com o comparator.

 

"O que seria um comparator ?"

O comparador, a grosso modo, é uma classe que compara os objetos (no seu caso, os valores de uma hashmap) tentando-os manter em ordem natural.

 

Você precisará criar uma classe que implementa Comparator, e que tem os métodos da classe comparator.

 

K7nsyed.png

 

A classe Implementa o Comparator<String> pois a key de sua hashmap é uma String.

 

O que faremos agora ?

Bom, precisamos fazer com que essa classe passe por todos os valores de sua hashmap e ordene-os.

Mas, que hashmap ?

Então, precisamos definir por qual hashmap o comparador passará. Faremos isso usando um Constructor.

 

XbZx5mR.png

 

Após isso, precisamos fazer com que o comparador ordene os valores da hashmap.

 

JPiAdsH.png

 

Como isso funciona ?

Quando o comparador passar por todos as keys de sua hashmap, ele lerá assim:

 

Se o Valor da 1ª key, for maior que o da 2ª key, a ordem é natural ?

Sim, a ordem seria natural, e DEVERIA retornar 1, mas por que retornou -1 ?

Simples, você precisa de um map ordenado na ordem DECRESCENTE, então

dizemos ao programa que NÃO ESTÁ NA ORDEM NATURAL, dai ele inverte a ordem.

 

Após fazer isso tudo, a sua classe comparadora estará completa.

 

Mas, como eu aplico isto no meu plugin ?

Simples, segue o guia:

 

1 - Temos o HashMap de nossos jogadores com seus respectivos kills (por exemplo):

 

QoMQgdw.png

 

Para ordenarmos esse hashmap, precisamos passa-lo para treemap com o nosso comparador;

Primeiro instanciamos a nossa classe do comparador:

 

zcQn4vl.png

Jogadores é o nome da hashmap em que seus jogadores se encontram.

 

Logo após isso, criamos a TreeMap que receberá os dados em ordem decrescente:

 

nP5FB9i.png

Comparador é o nome de nosso comparador citado acima :)

 

Após isso precisamos passar os valores para a TreeMap:

 

lsDLfHk.png

 

Feito, isso, está pronto.

O seu treemap em ordem decrescente já pode ser usado normalmente.

 

Fiz um teste e printei os valores desse treemap. Resultado:

 

4mGvtga.png

 

Extras:

 

Código completo no hastebin: https://hastebin.com/citiyivaze.java

 

Espero que tenha entendido, sei que ficou meio confuso, mas é por que é confuso mesmo.

Bom aprendizado :)

 

 

 

Link para o comentário
Compartilhar em outros sites

basicamente você quer um código pronto... mas não...

 

da uma olhada nessa classe>

https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

 

dps é só chamar esse método:

Collections.reverseOrder();

 

Perdão, achei que tinha postado em dúvidas, então eh pq eu não sei fazer ou seja quero um exemplo. Deixa de ser inútil, está na área só para ter uma tag ? Vou ver esse link, mas pelo jeito não entendi :)

Link para o comentário
Compartilhar em outros sites

Perdão, achei que tinha postado em dúvidas, então eh pq eu não sei fazer ou seja quero um exemplo. Deixa de ser inútil, está na área só para ter uma tag ? Vou ver esse link, mas pelo jeito não entendi :)

eu ajudo mas você ta pedindo o código pronto e eu acho isso errado, e provavelmente nem procurou direito

ta LOTADO de informação sobre isso na internet

Editado por jeta
Link para o comentário
Compartilhar em outros sites

eu ajudo mas você ta pedindo o código pronto e eu acho isso errado, e provavelmente nem procurou direito

ta LOTADO de informação sobre isso na internet

Sempre procuro na internet, e muitas vezes, quando nao entendo na net crio tópico na GB, e todas as vezes, explicam de uma maneira mais fácil e direta para o meu problema.

Não pode criar tópico? A área de dúvidas não tem requisito nenhum :v

 

Todos os tópicos que criei seu único comentário é reclamação, reveja seus conceitos =)

Link para o comentário
Compartilhar em outros sites

Sempre procuro na internet, e muitas vezes, quando nao entendo na net crio tópico na GB, e todas as vezes, explicam de uma maneira mais fácil e direta para o meu problema.

Não pode criar tópico? A área de dúvidas não tem requisito nenhum :v

 

Todos os tópicos que criei seu único comentário é reclamação, reveja seus conceitos =)

 

Mude os valores de double para Int/Integer

	public static List<Entry<String, Double>> getMoreValues() {
		HashMap<String, Double> names = new HashMap<>();
		for (Entry<UUID, Player_Cache> e : Main.getInstance().eco.entrySet()) {
			names.put(e.getKey().toString(), e.getValue().getCoins());
		}
		Set<Entry<String, Double>> set = names.entrySet();
		List<Entry<String, Double>> list = new ArrayList<Entry<String, Double>>(set);
		Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {
			public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		return list;
	}
	List<Entry<String, Double>> values = getMoreValues();


for (int x = 0; x < aki bota quantos vc qr ex: 10 vai mostrar 10 players; x++) {
int y = x;

if (x < values.size()) {

                                         //aki retorna o primeiro valor da hash
					String uid = values.get(x).getKey();
                                        // aki retorn o valor pd mudar para int se quiser
					Double v = values.get(x).getValue();


}




}

Tá +/-, mas acho que vai ajudar você.

Link para o comentário
Compartilhar em outros sites

public static HashMap<String, Integer> vezes = new HashMap<>();

public static LinkedHashMap<String, Integer> getSorted() {
    return vezes.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // compara pelo valor ( int ) em ordem reversa ( top )
        .limit(5) // limite para 5 resultados apenas, criando uma hash com apenas 5 entradas
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, // pega os resultados e retorna uma LinkedHashMap
            (oldValue, newValue) -> oldValue, LinkedHashMap::new)
        )
}

public static void doSomething(){
    LinkedHashMap<String, Integer> sortedMap = getSorted();

    if(sortedMap.isEmpty()) return;  // não tem nenhum, não pode fazer nada ao primeiro

    Map.Entry<String, Integer> entry = sortedMap.entrySet().stream().findFirst().get(); // pegamos a primeira entrada
    Bukkit.getServer().broadcastMessage(entry.getValue() + " - " + entry.getValue()); // fazemos algo com ela
}

logo-forum.png

 

 

Sua dúvida foi marcada como [Resolvido] e movido à área de dúvidas resolvidas.

 

 

Atenciosamente,

Gamer's Board

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...