Maison >Java >javaDidacticiel >La carte en Java peut-elle être triée par clé ?

La carte en Java peut-elle être triée par clé ?

青灯夜游
青灯夜游original
2019-12-31 15:59:523417parcourir

La carte en Java peut-elle être triée par clé ?

La carte peut-elle être triée par clé ?

La carte peut être triée par clé. Jetons un coup d'œil à un exemple ci-dessous.

Exemple : Java Map tri par clé et tri par valeur

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;

public class MapSortDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String, String> hMap = new HashMap<String, String>();
        hMap.put("a", "3");
        hMap.put("z", "2");
        hMap.put("b", "6");
        hMap.put("o", "9");

        System.out.println("根据key升序排序"); 
        Map<String, String> sortByKeyResultMap = sortMapByKey(hMap);    //按Key进行排序
        Iterator<Map.Entry<String, String>> sortByKeyEntries = sortByKeyResultMap.entrySet().iterator(); 
        while (sortByKeyEntries.hasNext()) { 
          Map.Entry<String, String> entry = sortByKeyEntries.next(); 
          System.out.println("Key = " + entry.getKey() + "------->Value = " + entry.getValue()); 
        }
        
        System.out.println("------------------------------"); 
        
        System.out.println("根据value降序排序"); 
        Map<String, String> sortByValueResultMap = sortMapByValue(hMap); //按Value进行排序
        Iterator<Map.Entry<String, String>> sortByValueEntries = sortByValueResultMap.entrySet().iterator(); 
        while (sortByValueEntries.hasNext()) { 
          Map.Entry<String, String> entry = sortByValueEntries.next(); 
          System.out.println("Key = " + entry.getKey() + "------->Value = " + entry.getValue()); 
        }
    }
    /**
     * 使用 Map按key进行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByKey(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
//        Map<String, String> sortMap = new TreeMap<String, String>(new MapKeyComparator());
        Map<String, String> sortMap = new TreeMap<String, String>(new Comparator<String>() {
            public int compare(String obj1, String obj2) {
                return obj1.compareTo(obj2);//升序排序
            }
        });
        sortMap.putAll(map);
        return sortMap;
    }
    
    /**
     * 使用 Map按value进行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByValue(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map<String, String> sortedMap = new LinkedHashMap<String, String>();
        List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(map.entrySet());
//        Collections.sort(entryList, new MapValueComparator());
        Collections.sort(
            entryList, 
            new Comparator<Map.Entry<String, String>>(){
                   public int compare(Entry<String, String> o1, Entry<String, String> o2) {
                       return o2.getValue().compareTo(o1.getValue());// 降序排序
                   }
            }
        );

        Iterator<Map.Entry<String, String>> iter = entryList.iterator();
        Map.Entry<String, String> tmpEntry = null;
        while (iter.hasNext()) {
            tmpEntry = iter.next();
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
        }
        return sortedMap;
    }
}

java map

Map est une interface de collection de paires clé-valeur, et sa mise en œuvre Les classes comprennent principalement : HashMap, TreeMap, Hashtable et LinkedHashMap, etc.

La carte n'autorise pas les clés en double, mais autorise les valeurs en double.

1. HashMap :

La carte la plus couramment utilisée stocke les données en fonction de la valeur du hashcode de la clé. Sa valeur peut être obtenue directement en fonction de la clé (car la même clé a la même chose. valeur de hashcode, et l'adresse est La valeur de hashcode stocke la valeur, donc la valeur peut être obtenue directement en fonction de la clé), qui a une vitesse d'accès très rapide, l'ordre d'obtention des données est complètement aléatoire. la clé d'un enregistrement doit être nulle au maximum et permet à plusieurs La valeur de l'enregistrement est nulle. HashMap ne prend pas en charge la synchronisation des threads, c'est-à-dire que plusieurs threads peuvent écrire HashMap en même temps à tout moment, ce qui entraînera une incohérence des données. . Si une synchronisation est nécessaire, vous pouvez utiliser la méthode synchronziedMap pour synchroniser HashMap ou utiliser concurrentHashMap

2 HashTable :

est similaire à HashMap, sauf qu'il n'autorise pas les clés enregistrées ou. les valeurs doivent être vides et prend en charge la synchronisation des threads, c'est-à-dire qu'un seul thread peut écrire dans HashTable à tout moment, cela ralentit également HashTable lors de l'écriture

3. >

est une sous-classe de HahsMap, mais elle conserve l'ordre d'insertion des enregistrements lors du parcours, le premier est définitivement le premier inséré, vous pouvez également prendre des paramètres lors de la construction et trier par nombre d'applications. sera plus lent que HahsMap, mais il y a une exception. Lorsque la capacité de HashMap est grande et que les données réelles sont petites, le parcours sera plus lent que LinkedHashMap (car il s'agit d'une chaîne), car la vitesse de parcours de HashMap est liée à son capacité, et la vitesse de parcours de LinkedHashMap est uniquement liée à la quantité de données

4. TreeMap :

implémente l'interface sortMap, qui peut trier les enregistrements enregistrés en fonction de la clé Tri (par défaut ordre croissant), vous pouvez également spécifier un comparateur de tri. Les données obtenues lors du parcours sont triées

Apprentissage recommandé :

Tutoriel vidéo Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn