【问题标题】:How to retrieve key & values from hashmap如何从哈希图中检索键和值
【发布时间】:2013-06-27 08:37:39
【问题描述】:

我正在尝试通过对象将值插入到哈希映射中,并且我想检查这些值是否插入到哈希映射中。所以我正在使用这段代码,但在运行时我无法获得任何输出。

如何解决这个问题?

代码:

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);
        }
    }
}

【问题讨论】:

  • 在循环中你应该做screen_dataz.put(k,longValues[k]); 再看看你的HashMap 你就会明白为什么了。
  • 请使用泛型以避免因错误类型转换而导致的潜在错误。
  • 99% 的时间使用 Object 是错误的。您一直使用 Object[] 在这种情况下,它们实际上似乎是 String[]
  • 正如您之前的问题所建议的那样:Java 是一种 OOP 语言。如果您开始使用自定义类,您将更容易编写和维护代码。 ObjectObject[]Object[][] 是非常糟糕的设计决策(在大多数情况下 - 肯定是你的)。

标签: java collections map hashmap


【解决方案1】:

首先,您必须将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();
 }

【讨论】:

    【解决方案2】:

    您的代码有一些修复/改进:

    • 在使用泛型时不要使用强制类型转换
    • 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 - 解决了大部分问题。不过,您仍然可以将 Object 更改为 String
    • @Andreas 我做了,但恢复了这个更改,认为可能有一些原因导致 OP 选择了Object 而不是String,如果不是,那么只需将Object 替换为String .
    【解决方案3】:

    代码中的一个更正:

    你可能想更新你的 for 循环

    作为

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

    【讨论】:

      【解决方案4】:

      首先,将您的 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();
      

      这将正确打印您的值。

      【讨论】:

        【解决方案5】:

        对这段代码有很多评论。

        首先,参数化类型的泛型参数不正确。该地图当前存储Map&lt;Long,Object[]&gt;,但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());
                    }
                }
            }
        
        }
        

        【讨论】:

          【解决方案6】:

          我认为在循环中使用screen_dataz.put(k,longValues[k]); 会对您有所帮助。 您也可以为此使用迭代器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-02
            • 1970-01-01
            • 1970-01-01
            • 2013-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-12
            相关资源
            最近更新 更多