如何从哈希映射中检索键和值

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
99%的情况下使用Object是错误的。在这种情况下,你所使用的所有Object[]实际上似乎都应该是String[]。 - Richard Tingle
根据您之前的问题提议:Java是一种面向对象的语言。如果您开始使用自定义类,将会产生更易于编写和维护的代码。在大多数情况下,“Object”、“Object[]”和“Object[][]”都是非常糟糕的设计决策(尤其是在您的情况下)。 - jlordo
6个回答

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

5
您的代码经过一些修复/改进后如下所示:

  • do not use casting when using generics
  • the loop adding elements to screen_dataz was always adding the same object
  • the value stored in the map is an array which means it will not be printed as you expect with a simple call to 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 - Andreas Fester
@Andreas 我试过了,但是又撤销了这个更改,我想也许原帖作者选择使用 Object 而不是 String 是有一些原因的,如果没有的话,就把 Object 替换成 String - Adam Siemion

1

你的代码需要进行一处更正:

你可能需要更新你的for循环

如下所示:

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

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]); 会对你有所帮助。 你也可以使用迭代器来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接