2013-06-27 84 views
3

我想通過對象插入哈希映射的值,我想檢查值是否插入哈希映射。所以我使用這段代碼,但在運行時我無法獲得任何輸出。如何從哈希映射檢索鍵和值

如何解決這個問題?

代碼:

在你的代碼
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

使用Object的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循環

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'over'String'可能有一些原因,如果不是,那麼只需用'String'替換Object。 –

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。我假設你想在Map中輸入每個Object[]作爲單獨的Entry

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]);會幫助你。 你也可以使用迭代器。