2015-01-21 1 views
1

Мне нужен набор, который позволяет мне заказывать элемент по ключу. Ключи Integer, но они не являются последовательными. Это и пример того, что у меня есть:Как получить данные TreeMap (или, если необходимо, Map Map) в отсортированном порядке?

<3, Alessandro> 
<12, Mario> 
<1, Marco> 

И мне нужно напечатать эти элементы в следующем порядке:

Marco  
Alessandro 
Mario 

Я попытался с помощью TreeMap, но я не могу сделать петлю, как это:

for(int i = 0; i < treeMap.size(); i++){  
    System.out.println(treeMap.get(i));   
} 

потому что ключ не является последовательным и я получаю сообщение об ошибке при вызове treeMap.get(), потому что я не знаю ключ целого числа.

+0

возможный дубликат http://stackoverflow.com//questions/663374/java-ordered-map –

+1

Но [ 'TreeMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html) - это правильный класс для использования. Итерация выполняется с помощью 'for (целочисленный ключ: map.keySet()) {System.out.println (map.get (ключ)); } ' – Seelenvirtuose

+1

@Mustafasabir' TreeMap' - это 'SortedMap'! – Seelenvirtuose

ответ

4

get получает по ключ, а не положение индекса. Итерации по entrySet или keySet.

Установка:

TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>(); 

treeMap.put(3, "Alessandro"); 
treeMap.put(12, "Mario"); 
treeMap.put(1, "Marco"); 

Пример использования entrySet, в этом случае вы получите Map.Entry<Integer, String> для каждой итерации:

for (Map.Entry<Integer, String> entry : treeMap.entrySet()) { 
    System.out.println(entry.getValue()); 
} 

Или, если вы предпочитаете keySet, который дает вам ключи (Integer s) :

for (Integer key : treeMap.keySet()) { 
    System.out.println(treeMap.get(key)); 
} 

Либо , приведенные выше результаты:

 
Marco 
Alessandro 
Mario 

Например, упорядоченный по естественному порядку ключей.

+0

Спасибо всем, я использовал Map.Entry, добавляя , и он работает – MDP

2

Если вам действительно нужно использовать set вместо Map, вы можете использовать TreeSet и как тип, используемый в объекте set use, который обертывает ключ и значение и сравнивается по ключу. Пример ниже:

package com.stackoverflow; 

public class KeyValue<K extends Number, V> implements Comparable<KeyValue<K, V>> { 

    private final K key; 

    private final V value; 

    public KeyValue(K key, V value) { 
     this.key = key; 
     this.value = value; 
    } 

    public K getKey() { 
     return key; 
    } 

    public V getValue() { 
     return value; 
    } 

    @Override 
    public int compareTo(KeyValue<K, V> o) { 
     long keyValue = key.longValue(); 
     long argKeyValue = o.key.longValue(); 
     return (keyValue == argKeyValue) ? 0 : (keyValue < argKeyValue) ? -1 : 1; 
    } 

    @Override 
    public String toString() { 
     return key.toString() + ": " + value.toString(); 
    } 
} 

И использование образца:

package com.stackoverflow; 

import java.util.TreeSet; 

public class Main { 

    public static void main(String[] args) { 
     TreeSet<KeyValue<Integer, String>> keyValues = new TreeSet<KeyValue<Integer, String>>(); 

     KeyValue<Integer, String> keyValue1 = new KeyValue<Integer, String>(2, "asd"); 
     KeyValue<Integer, String> keyValue2 = new KeyValue<Integer, String>(102, "sfsaf"); 
     KeyValue<Integer, String> keyValue3 = new KeyValue<Integer, String>(12, "dgs"); 
     KeyValue<Integer, String> keyValue4 = new KeyValue<Integer, String>(222, "dsgds"); 
     KeyValue<Integer, String> keyValue5 = new KeyValue<Integer, String>(22, "aa"); 
     KeyValue<Integer, String> keyValue6 = new KeyValue<Integer, String>(1, "sfasaf"); 
     KeyValue<Integer, String> keyValue7 = new KeyValue<Integer, String>(3, "sfs"); 
     KeyValue<Integer, String> keyValue8 = new KeyValue<Integer, String>(4, "www"); 

     keyValues.add(keyValue1); 
     keyValues.add(keyValue2); 
     keyValues.add(keyValue3); 
     keyValues.add(keyValue4); 
     keyValues.add(keyValue5); 
     keyValues.add(keyValue6); 
     keyValues.add(keyValue7); 
     keyValues.add(keyValue8); 

     for (KeyValue<Integer, String> keyValue : keyValues) { 
      System.out.println(keyValue); 
     } 
    } 
}