6
votes

Tri des objets HASHMAP sur leurs propriétés plutôt que des valeurs

Ce n'est pas mon vrai code que je viens de simuler afin de comprendre quoi faire ensuite.

J'ai une personne de classe avec des propriétés Âge, poids de la hauteur.
Maintenant dans mon groupe de classe
Je crée deux quatre objets

rollCall.put(programmer, 1);
rollCall.put(clerk, 2);
rollCall.put(student, 1);
rollCall.put(tech, 3);


4 commentaires

Regardez ici: Stackoverflow.com/Questtions/109383/...


Il n'y a pas de moyen facile J'ai peur. Regardez le lien de la surbose ci-dessus. (Je pense que certaines des réponses ci-dessous supposent que vous souhaitez trier sur les touches ( personne ).)


oui je veux trier sur les clés non valeurs


Comment puis-je le trier pour la carte . J'ai un problème similaire à cela, mais j'ai besoin de trier des valeurs.


5 Réponses :


1
votes

Tout d'abord, Treemap Tries sur les touches et non des valeurs. Donc, cela fonctionne déjà en votre faveur. Tout objet que vous utilisez comme une clé dans un Treemap doit Implément comparable ou vous devez fournir un comparateur en tant que Argument de constructeur. Tout ce que vous avez à faire est d'avoir votre comparèteo () méthode (à partir de comparable ) ou comparer () méthode (à partir de comparateur ) Comparez basé sur votre getage () Propriété.

Le treemap constructeur qui prend un comparateur est décrit ici. Le comparateur sera utilisé pour trier les touches de la carte. < / p>


2 commentaires

Je ne suis pas disposé à gâcher avec la classe de ma personne. Dans ce cas, je dois créer une nouvelle classe de compréhension et utiliser la méthode de comparaison (objet O1, objet O2). Mais le problème ici est que Compator fonctionne uniquement avec des collections et non des cartes ?? Existe-t-il un moyen d'utiliser Comprator pour Treemap? n'importe quel exemple?


J'ai ajouté un lien vers le constructeur que j'ai mentionné à ma réponse ci-dessus. Ce constructeur prend un comparateur comme argument et l'utilise pour comparer les touches.



1
votes

Vous devez être capable de comparer les objets de votre personne. S'il y a une façon canonique de les comparer, laissez-les mettre en œuvre comparable (c'est-à-dire leur donner un comparèteo (personne) méthode.

Si cela est fait, vous pouvez utiliser les personnes comme touches pour une sorte de type (comme Treemap).

S'il y a plusieurs façons, deux personnes pourraient être comparées, implémenter un comparateur comme objet distinct.

Ensuite, donnez ce comparateur au tri de la construction.

Cela ne triera pas votre hashmap (un hashmap a toujours un ordre apparemment aléatoire), mais vous donnera une autre forme de données triée à la place.


0 commentaires

-1
votes
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/*
 * Sort HashMap that contains Student object
 */

public class SortHashMap implements Comparator<Student>
{
    public static void main(String[] args)
    {
        Map map = new HashMap();
        map.put("s1", new Student(5,"utpal"));
        map.put("s2", new Student(4,"ramesh"));
        map.put("s3", new Student(10,"tushar"));
        map.put("s4", new Student(2,"anindya"));
        Collection<Student> students = map.values();
        List list = new ArrayList(students);
        Collections.sort(list,new SortHashMap());

        for (Iterator it = list.iterator(); it.hasNext();) 
        {         
            Student stdn = (Student)it.next();             
            System.out.println("Student id : "+stdn.id);
            System.out.println("Student Name : "+stdn.name);            
        } 
    }
    @Override
    public int compare(Student s1, Student s2) 
    {
        return s1.name.compareTo(s2.name);
    }
}

class Student 
{    
    int id;
    String name;
    Student(int id,String name)
    {
        this.id = id;
        this.name = name;
    }    
}

0 commentaires

6
votes

Vous pouvez obtenir une carte qui itière en augmentant l'augmentation ou la diminution de l'ordre en utilisant un comparateur personnalisé: xxx

lorsque vous ajoutez des personnes à la collection qu'ils seront insérées dans l'ordre par âge.


0 commentaires

0
votes
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class PersonSort {

    private MySort sort = new MySort();
    private Map<Person, String> map = new HashMap<Person, String> ();
    private Map<Person, String> treeMap = new TreeMap<Person, String>(sort);

    Person e1 = new Person(500, "Saurabh");
    Person e2 = new Person(400, "Kishan");
    Person e3 = new Person(900, "Ashwini");

    public void myMap() {

        map.put(e3, "Ash");
        map.put(e2, "Krish");
        map.put(e1, "Sau");

        Iterator it = map.keySet().iterator();
        System.out.println("UnSorted Map");
        while(it.hasNext()) {
            System.out.println(map.get(it.next()));
        }

        treeMap.putAll(map);
        System.out.println("SortedMap");
        Iterator it1 = treeMap.keySet().iterator();
        while(it1.hasNext()) {
            System.out.println(treeMap.get(it1.next()));
        }
    }

    public static void main(String[] args) {
        PersonSort es = new PersonSort();
        es.myMap();
        }
}

class Person {
    Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    private int id;
    private String name;
    //Getters and Setters
}

class MySort implements Comparator<Object> {
    public int compare(Object o1, Object o2) {
        return ((Person) o1).getId() - ((Person)o2).getId();
    }
}

0 commentaires