2011-06-08 3 views
4
import java.util.*;  
public class Test { 
     public static void main(String[] args) { 

      Map<String,String> map = new TreeMap<String,String>(); 
      map.put("10", "America"); 
      map.put("1", "Australia"); 
      map.put("2", "India"); 
      map.put("11", "China"); 

      System.out.println(map); 

     } 
    } 

Lorsque vous exécutez l'extrait de code ci-dessus, dans la console que je reçois la sortie comme:TreeMap se comporte anormalement

{1=Australia, 10=America, 11=China, 2=India}

Mais je suis sortie attends que

{1=Australia, 2=India, 10=America, 11=China}

Mais en changeant la logique comme mentionné ci-dessous à l'intérieur au-dessus principal()

Map<String,String> map = new TreeMap<String,String>(); 
     map.put("US", "America"); 
     map.put("AUS", "Australia"); 
     map.put("IN", "India"); 
     map.put("CH", "China"); 

    System.out.println(map); 

Je reçois la sortie désirée

({AUS=Australia, CH=China, IN=India, US=America})

Comme par entrySet() ma compréhension TreeMap méthode renvoie une vue ensemble des applications contenues dans la carte. L'itérateur de l'ensemble renvoie les mappages dans l'ordre croissant des clés. Alors pourquoi cela se passe-t-il dans le premier cas?

Toute suggestion est fortement appréciée.

+4

Astuce: '1 = "1"' –

+2

le titre est incroyable!. presque aussi utile que: 'treemap ne fonctionne pas' – bestsss

+0

Désolé bestsss il n'y a rien d'être si grave – Neel

Répondre

14

Parce que "10" est lexicographique plus petit que "2".


Voici un indice:

Map<Integer,String> map = new TreeMap<Integer,String>(); 
map.put(10, "America"); 
map.put(1, "Australia"); 
map.put(2, "India"); 
map.put(11, "China"); 

System.out.println(map); 
// {1=Australia, 2=India, 10=America, 11=China} 

Voici une autre astuce: String#compareTo(String) vs Integer#compareTo(Integer).


Pouvez-vous s'il vous plaît expliquer ce que ne fait-vous dire par « « 10 » est lexicographique plus petit que « 2 » ». Tout d'abord, lisez le lien JavaDoc I, en particulier le premier lien.

Maintenant, nous allons examiner quelques comparaisons de chaînes simples:

  • "a" vient évidemment avant "b"
  • également "b" vient avant "z"

Il ne doit pas être beaucoup d'un tronçon de l'étendre à des caractères numériques:

  • « 0 » vient avant « 1 »
  • "1" vient avant "9"

L'ordre des caractères individuels, tels que a, b, z, 0, 1 et 9 est appelé leur lexicographical order. Bref, chaque personnage a une représentation numérique que vous ne trouverez pas terriblement surprenante.

Maintenant, regardons quelques comparaisons de chaîne un peu plus compliquées:

  • « aa » vient avant « bb » (cela ne devrait pas être une surprise)
  • « aa » vient aussi avant " ab "

Comment avons-nous déterminé le second cas? Caractère par caractère. Un autre exemple: "ba" vient avant "c", puisque "b" vient avant "c".

Faisons la même chose pour les chaînes contenant des caractères numériques:

  • -ce que "2" venir avant "10"? Nous comparons caractère par caractère:

    1. Est-ce que "2" précède "1"? Non, ça vient après, donc nous avons déjà fini.
+0

Pouvez-vous s'il vous plaît expliquer ce que vous voulez dire par "'10' est lexicographiquement plus petit que '2'". – Neel

+0

Lisez les JavaDocs liés pendant que je tape quelque chose. –

+2

"10" est inférieur à "2" tout comme "BA" est inférieur à "C". Dans votre cas, le "1" dans "10" est inférieur à "2". –