es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es el mejor método para ordenar un Hashtable que tiene una clase como valor con múltiples variables (enteros) en Java?

Tengo un sistema para verificar y ordenar por valor en un Hashtable, que se utiliza para obtener las mejores Cadenas de caracteres en ese Hashtable. Quiero establecer otro valor en ese Hashtable, así que estoy utilizando una clase interna, de esta manera:

Map<string, values=""> hash = new Hashtable<string,values>();

La clase:

public class Values {
    public Integer a;
    public Integer b;

    public Values(Integer a, Integer b) {    
        this.a = a;
        this.b = b;
    }    
}

Mi objetivo es ordenar todos los valores en el Hashtable (Integer a y b) y devolver la Cadena de caracteres del Hashtable que muestra quién tiene los valores más altos (como un sistema de base de datos). ¿Es posible hacer eso? La razón por la que quiero hacer eso es para obtener a los mejores “killers” en un juego ordenando por Integer a y establecer la hora en la que se realizó el último “kill” en Integer b. Así, si el jugador ha matado antes que el otro y tiene la misma cantidad de “kills”, muestra primero al que tiene el Integer b más alto, que sería el que tiene el tiempo más alto (en milisegundos) en la variable b.

¿Cuál sería el mejor método para hacer algo así?</string,values></string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr este objetivo, puedes utilizar la clase TreeMap en Java, que implementa la interfaz SortedMap y te permite ordenar las entradas en el mapa por clave o por valor. Para ordenar un Hashtable por valor utilizando la clase TreeMap, necesitas crear un objeto Comparator que compare los valores en el mapa y luego utilizar el constructor de TreeMap que toma un Comparator como parámetro para crear un mapa ordenado basado en los valores. Aquí tienes un ejemplo de código que demuestra cómo hacerlo:

    import java.util.*;
    
    public class RankingAsesinos {
    
        public static void main(String[] args) {
    
            // crear un Hashtable con datos de ejemplo
            Map<string, valores=""> hash = new Hashtable<>();
            hash.put("Jugador 1", new Valores(5, 1000));
            hash.put("Jugador 2", new Valores(3, 2000));
            hash.put("Jugador 3", new Valores(7, 500));
            hash.put("Jugador 4", new Valores(7, 1500));
    
            // crear un Comparator que compare los valores del HashMap
            Comparator<string> comparadorValor = new Comparator<string>() {
                @Override
                public int compare(String s1, String s2) {
                    Valores v1 = hash.get(s1);
                    Valores v2 = hash.get(s2);
                    int resultado = v2.a.compareTo(v1.a);
                    if (resultado == 0) {
                        resultado = v2.b.compareTo(v1.b);
                    }
                    return resultado;
                }
            };
    
            // crear un TreeMap que esté ordenado por valor (en orden descendente)
            Map<string, valores=""> mapaOrdenado = new TreeMap<>(comparadorValor);
            mapaOrdenado.putAll(hash);
    
            // imprimir los jugadores en el orden ordenado
            for (Map.Entry<string, valores=""> entrada : mapaOrdenado.entrySet()) {
                System.out.println(entrada.getKey() + ": " + entrada.getValue().a + " asesinatos - Último asesinato hace: " +
                        entrada.getValue().b + " milisegundos");
            }
        }
    }
    

    En este ejemplo, el Comparator compara los valores del Hashtable (objetos Valores) basándose en los campos a y b, y los ordena en orden descendente de a. Si dos jugadores tienen la misma cantidad de asesinatos (a), los ordena basándose en el campo b en orden ascendente (primer asesinato más antiguo). El mapaOrdenado se crea utilizando el constructor de TreeMap que toma el Comparator y las entradas se agregan desde el mapa original hash utilizando el método putAll. Por último, los jugadores se imprimen en orden ordenado utilizando un bucle for-each sobre entrySet() del mapaOrdenado.

    Este código se puede adaptar a tu caso de uso donde tienes un Hashtable con los datos de los jugadores y deseas ordenarlos en función de los asesinatos y el tiempo del último asesinato. Solo necesitas reemplazar los datos de ejemplo con tus propios datos y ajustar el Comparator para comparar los campos correctos en los objetos Valores.</string,></string,></string,>

Comments are closed.