2015-07-25 2 views
0

Im new для java, и я работаю над вопросом, где мне нужно выводить элементы из HashMap в порядке ввода. Я понял, что HashMap не может этого сделать, и LinkedHashMap был специально разработан для поддержания этого заказа. Я применил LinkedHashMap в своей проблеме, но выход не последовал за входной последовательностью. Пожалуйста, помогите мне в этом. Пожалуйста, найдите мой вопрос и код ниже.Вывести числа в последовательности, используя LinkedHashMap в Java

Пользователь вводит количество имен n и имена лиц (имена добавляются в карту с именем будучи key и командный номер он/она принадлежит, как value). Я должен напечатать соответствующие values имена, которые вводит пользователь.

Входной сигнал: 4

Aurora

Дамбо

Ариэль

Bambi

Выход: Он должен быть [1,3,1,2] - выход из list

Но выход я получаю из приведенной ниже программы [1,1,2,3]

Я попытался выяснить, что была моя ошибка, но в vain.Kindly помощь по этому вопросу. Благодарю.

import java.io.*; 
import java.util.*; 

public class DonaldPostman { 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     PrintWriter out = new PrintWriter(System.out); 

    Map<String,Integer> m = new LinkedHashMap<String,Integer>(); 
    List<Integer> l = new ArrayList<Integer>(); 
    m.put("Aurora", 1);m.put("Ariel", 1);m.put("Alice", 1);m.put("Phil", 1);m.put("Peter", 1);m.put("Olaf", 1);m.put("Phoebus", 1);m.put("Ralph", 1);m.put("Robin", 1); 
    m.put("Bambi", 2);m.put("Belle", 2);m.put("Bolt", 2);m.put("Mulan", 2);m.put("Mowgli", 2);m.put("Mickey", 2);m.put("Silver", 2);m.put("Simba", 2);m.put("Stitch", 2); 
    m.put("Dumbo", 3);m.put("Genie", 3);m.put("Jiminy", 3);m.put("Kuzko", 3);m.put("Kida", 3);m.put("Kenai", 3);m.put("Tarzan", 3);m.put("Tiana", 3);m.put("Winnie", 3); 

    int n = in.nextInt(); 
    String[] arr = new String[n]; 
    for(int i=0;i<n;i++) { 
     arr[i] = in.next(); 
    } 

    Set ms = (Set) m.entrySet(); 
    Iterator it = ms.iterator(); 
    while (it.hasNext()) { 
     Map.Entry mapEntry = (Map.Entry) it.next(); 
     String key = (String) mapEntry.getKey(); 
     Integer value = (Integer) mapEntry.getValue(); 
     for(int i=0;i<arr.length;i++) { 
      if(arr[i].equals(key)) { 
       l.add(value); 
      } 
     } 

    } 
    System.out.println(l); 
} 

} 
+0

Почему вы думаете, это должно быть то, что выход? –

+0

Вы добавляете их в порядке очереди 1 на 2, а затем 3. Почему вы ожидаете, что заказ будет «1,3,1,2'? –

+0

имена, которые вводит пользователь, могут быть любыми. Я хочу напечатать значение конкретного имени, которое вводит пользователь. – Dev

ответ

0

Ожидается, что числа появятся в том порядке, в котором вы их найдете. Это, конечно, не имеет никакого отношения к порядку, в котором они хранятся. например

Например, если вы попросите AuroraDumboAlice и Bolt сканирования через коллекцию для того, чтобы вы добавили слова в коллекцию ищет спичку. Хотя это неэффективно, оно может работать, если это то, что вы ожидали.

Однако, похоже, вы ожидали, что они будут в том порядке, в котором вы ввели слова. На самом деле это гораздо проще и гораздо более эффективным, как вы можете использовать Map.get (String)

Вы можете заменить оба ваши петли с этим

// add the lookup value in the order the words are entered 
// not the order they appear in the original map. 
for(int i = 0; i < n; i++) { 
    String name = in.next(); 
    l.add(map.get(name)); 
} 
+0

Спасибо. Это то, чего я действительно ожидал. Я только что узнал о «Картах». 'Map.get (String)'. Еще раз спасибо! – Dev

+0

@Dev Примечание. Это операция O (1) вместо сканирования всех записей, которые являются O (N). то естьон может быть на 1000000x быстрее, если у вас есть миллионы элементов. –

+0

это должно быть O (n) только правильно .. потому что, если значение n велико. Временная сложность увеличивается правильно. Пожалуйста, исправьте меня, если Im неправильно. – Dev