2013-06-27 5 views
3

Я пытаюсь вставить значения в хэш-карту через объект, и я хочу проверить, вставлены ли значения в хэш-карту. поэтому я использую этот код, но во время выполнения я не могу получить какой-либо результат.Как получить ключ и значения из hashmap

Как это решить?

Код:

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

public class TaskList 
{ 

    private static HashMap<Integer, Object[]> dataz = new HashMap<Integer,Object[]>(); 
    private static HashMap<Integer, Object[]> screen_dataz = new HashMap<Integer,Object[]>(); 
    public final static Object[][] longValues = {{"10", "kstc-proc", "10.10.10.10.10.","5","O"},{"11", "proc-lvk1", "12.1.2.","4","O"},{"13", "trng-lvk1", "4.6.1.","3","O"}}; 
    private static String sl,pid,tid,mval,status; 

    public static void main(String args[]) 
    { 
     addTask(); 
    } 

    public static void addTask() 
    { 
     for (int k=0; k<longValues.length; k++) 
     { 
     screen_dataz.put(k,longValues); 
     } 
     Set mapSet = (Set) screen_dataz.entrySet(); 
     Iterator mapIterator = mapSet.iterator(); 
     while (mapIterator.hasNext()) 
     { 
     Map.Entry mapEntry = (Map.Entry) mapIterator.next(); 
     String keyValue = (String) mapEntry.getKey(); 
     String value = (String) mapEntry.getValue(); 
     System.out.println(value); 
     } 
    } 
} 
+1

В цикле вы должны сделать 'screen_dataz.put (k, longValues ​​[k]);' Посмотрите на свой 'HashMap' еще раз, и вы поймете, почему. – Maroun

+7

Пожалуйста, используйте дженерики, чтобы избежать потенциальных ошибок из-за неправильного приведения типов. – jlordo

+1

99% времени, использующего объект, является неправильным. Все время, когда вы использовали Object [], они, по-видимому, на самом деле являются String [] в этом случае –

ответ

5

Во-первых, вы должны добавить строку матрицы longValues к карте, а не всей матрицы:

for (int k=0; k<longValues.length; k++) 
{ 
    screen_dataz.put(k,longValues[k]); 
} 

Затем, в то время как итерация извлечь значение, как Object[] и не String, и ключ, как Integer

while (mapIterator.hasNext()) 
{ 
    Map.Entry mapEntry = (Map.Entry) mapIterator.next(); 
    Integer keyValue = (Integer) mapEntry.getKey(); 
    Object[] value = (Object[]) mapEntry.getValue(); 
    //iterate over the array and print each value 
    for (int i=0; i<value.length; i++) { 
     System.out.print(value[i] + " "); 
    } 
    System.out.println(); 
} 
1

Одно исправление в вашем коде:

Вы можете захотеть обновить ваш цикл

в

for (int k=0; k<longValues.length; k++) 
    { 
    screen_dataz.put(k,longValues[k]); 
    } 
5

Ваш код с несколькими исправлений/улучшений:

  • не используют литье при использовании дженериков
  • петля, добавляющая элементы к screen_dataz всегда добавлял и тот же объект
  • значение, сохраненное в карте массив, который означает, что он не будет печататься, как вы ожидаете, с помощью простого вызова toString()

    public class TaskList { 
        private static HashMap<Integer, String[]> dataz = new HashMap<Integer, String[]>(); 
        private static HashMap<Integer, String[]> screen_dataz = new HashMap<Integer, String[]>(); 
        public final static String[][] longValues = { 
          { "10", "kstc-proc", "10.10.10.10.10.", "5", "O" }, 
          { "11", "proc-lvk1", "12.1.2.", "4", "O" }, 
          { "13", "trng-lvk1", "4.6.1.", "3", "O" } }; 
        private static String sl, pid, tid, mval, status; 
    
        public static void main(String args[]) { 
         addTask(); 
        } 
    
        public static void addTask() { 
         for (int k = 0; k < longValues.length; k++) { 
          screen_dataz.put(k, longValues[k]); 
         } 
         Set<Entry<Integer, String[]>> mapSet = screen_dataz.entrySet(); 
         Iterator<Entry<Integer, String[]>> mapIterator = mapSet.iterator(); 
         while (mapIterator.hasNext()) { 
          Entry<Integer, String[]> mapEntry = mapIterator.next(); 
          Integer keyValue = mapEntry.getKey(); 
          String[] value = mapEntry.getValue(); 
          System.out.println(Arrays.toString(value)); 
         } 
        } 
    } 
    
+1

+1 - это исправляет большинство проблем. Однако вы все равно можете изменить 'Object' на' String'. –

+0

@ Andreas Я сделал, но вернул это изменение, подумал, что, возможно, была какая-то причина, почему OP выбрал 'Object' над' String', если не тогда, то просто замените 'Object' на' String'. –

0

Во-первых, изменить ваш for цикл для заполнения до screen_dataz вот так.

for (int k=0; k<longValues.length; k++) 
{ 
    screen_dataz.put(k,longValues[k]); 
} 

Далее сделайте ниже изменения: -

String keyValue = mapEntry.getKey().toString(); 
String value = Arrays.asList((Object[])mapEntry.getValue()).toString(); 

Это будет печатать вашу ценность должным образом.

0

Несколько комментариев к этому коду.

Во-первых, общие аргументы параметризованного типа неверны. В настоящее время карта хранит Map<Long,Object[]>, однако объекты Object[][] добавлены к Map. Я предполагаю, что вы хотите ввести каждый Object[] в качестве отдельного Entry в Map.

for (int k=0; k<longValues.length; k++) 
    { 
    screen_dataz.put(k,longValues[k]); 
    } 

Вторая часть, чтобы смотреть на это итерации над Map записей. Вместо использования Iterator используйте петлю for..each.

for(Entry<Integer,Object[]> entry: screen_dataz.entrySet()){ 
     //repetitive task 
    } 

Окончательный выход

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Set; 

public class TaskList 
{ 

    private static HashMap<Integer, Object[]> dataz = new HashMap<Integer,Object[]>(); 
    private static HashMap<Integer, Object[]> screen_dataz = new HashMap<Integer,Object[]>(); 
    public final static Object[][] longValues = {{"10", "kstc-proc", "10.10.10.10.10.","5","O"},{"11", "proc-lvk1", "12.1.2.","4","O"},{"13", "trng-lvk1", "4.6.1.","3","O"}}; 
    private static String sl,pid,tid,mval,status; 

    public static void main(String args[]) 
    { 
     addTask(); 
    } 

    public static void addTask() 
    { 
     for (int k=0; k<longValues.length; k++) 
     { 
     screen_dataz.put(k,longValues[k]); 
     } 

     for(Entry<Integer,Object[]> entry: screen_dataz.entrySet()){ 
      System.out.println(entry.getKey()); 
      for(Object obj: entry.getValue()){ 
        System.out.println(obj.toString()); 
      } 
     } 
    } 

} 
0

Я думаю, с помощью screen_dataz.put(k,longValues[k]); в цикле поможет. Для этого также можно использовать итератор.