2014-09-12 7 views
0

Как получить значения определенного диапазона ключей в HashMap в Java? Предположим, у меня есть HashMap, имеющие ключи и значения следующим образом:Как получить значения определенного диапазона ключей в HashMap в Java?

Map <Integer , String> map = hnew HashMap <Integer , String>(); 

map.put(1 , "A"); 
map.put(3 , "C"); 
map.put(2 , "B"); 
map.put(4 , "D"); 
map.put(5 , "E"); 
map.put(6 , "F"); 

Теперь, как я должен повторять, чтобы получить значения для ключей 2 в 5 (то есть 2, 4 и 5 но не3)?

+1

'Карта 'is * не упорядочен *. Поэтому неважно, положите ли вы '2' после' 3'. – 2014-09-12 10:21:56

+0

Да, это я знаю. Недавно аналогичные qn были заданы в интервью, и они спросили, как я должен итерации, чтобы получить значения в порядке (по мере их хранения). – narendrak

+0

Если вы используете 'Map' и' HashMap', ответ таков: вы не можете. – 2014-09-12 10:49:18

ответ

2

Либо:

  1. Loop через список ключей, которые вы хотите и запросить HashMap для значения, соответствующего этому ключу (быть в курсе некоторых может быть пустым).

  2. Проникните entrySetHashMap, чтобы посмотреть, есть ли ключ, который вы хотите.

  3. Используйте карту, которая хранит заказ (добавленный в правильном порядке) и перебирает требуемый блок записей.

0

A Map не имеет заказа на ключи. Неважно, если вы put ключ 3, а затем ключ 2. Этот «порядок» не сохраняется.

Я не вижу ничего особенного ключей 2, 4 и 5. Таким образом, вы можете сделать это:

for (int key : new int[] {2, 4, 5}) { 
    String value = map.get(key); 
} 
0

Если вы хотите сохранить порядок вставки для отображения затем использовать LinkedHashMap. Затем вы можете перебирать карту по определенному значению. Объявите массив Integer, для которого вы хотите получить значение.

int a[] = {2,4,5}; 
for(int i : a) { 
String str = map.get(i); 
doSomething(str); //method to operate on that string. 
} 
0

Если вы хотите иметь предсказуемый порядок в клавишах Map, вам нужно использовать подкласс LinkedHashMap.

Вот пример кода, который делает то, что вы хотите:

public class Snippet { 

    public static void main(String[] args) { 
     LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>(); 

     map.put(1, "A"); 
     map.put(3, "C"); 
     map.put(2, "B"); 
     map.put(4, "D"); 
     map.put(5, "E"); 
     map.put(6, "F"); 

     System.out.println(valuesBetween(2, 5, map)); 
    } 

    public static List<String> valuesBetween(int from, int to, LinkedHashMap<Integer, String> map) { 
     List<String> result = new ArrayList<>(); 
     boolean inRange = false; 
     for (Map.Entry<Integer, String> entry : map.entrySet()) { 
      if (entry.getKey() == from) 
       inRange = true; 
      if (inRange) 
       result.add(entry.getValue()); 
      if (entry.getKey() == to) 
       break; 
     } 
     return result; 
    } 
} 

Это будет печатать:

[B, D, E] 
+0

Или вы можете использовать 'TreeMap ' и просто вызывать 'subMap (2, 6);': / – jdb1015

0

собака, это все, что вам нужно:

SortedMap<Integer, String> map = new TreeMap<Integer, String>(); 
map.subMap(2, 6); 
Смежные вопросы