Hashmap将不同的数据类型保存为Integer,String和Object的值

use*_*439 45 java types hashmap

我需要使用key作为整数创建一个hashmap,它应该包含不同数据类型的多个值.例如,如果键是msg id且值是

  1. 类型字符串的消息
  2. 类型时间的时间戳
  3. 整数类型的计数
  4. 整数类型的版本

那么如何使用单个键将不同数据类型的值存储到hashmap中?

小智 45

如果您没有自己的数据类,则可以按如下方式设计地图

Map<Integer, Object> map=new HashMap<Integer, Object>();
Run Code Online (Sandbox Code Playgroud)

这里不要忘记在从MAP中检索值时使用"instanceof"运算符.

如果您有自己的Data类,那么您可以按如下方式设计地图

Map<Integer, YourClassName> map=new HashMap<Integer, YourClassName>();

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;


public class HashMapTest {
public static void main(String[] args) {
    Map<Integer,Demo> map=new HashMap<Integer, Demo>();
    Demo d1= new Demo(1,"hi",new Date(),1,1);
    Demo d2= new Demo(2,"this",new Date(),2,1);
    Demo d3= new Demo(3,"is",new Date(),3,1);
    Demo d4= new Demo(4,"mytest",new Date(),4,1);
    //adding values to map
    map.put(d1.getKey(), d1);
    map.put(d2.getKey(), d2);
    map.put(d3.getKey(), d3);
    map.put(d4.getKey(), d4);
    //retrieving values from map
    Set<Integer> keySet= map.keySet();
    for(int i:keySet){
        System.out.println(map.get(i));
    }
    //searching key on map
    System.out.println(map.containsKey(d1.getKey()));
    //searching value on map
    System.out.println(map.containsValue(d1));
}

}
class Demo{
    private int key;
    private String message;
    private Date time;
    private int count;
    private int version;

    public Demo(int key,String message, Date time, int count, int version){
        this.key=key;
        this.message = message;
        this.time = time;
        this.count = count;
        this.version = version;
    }
    public String getMessage() {
        return message;
    }
    public Date getTime() {
        return time;
    }
    public int getCount() {
        return count;
    }
    public int getVersion() {
        return version;
    }
    public int getKey() {
        return key;
    }
    @Override
    public String toString() {
        return "Demo [message=" + message + ", time=" + time
                + ", count=" + count + ", version=" + version + "]";
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 23

你有一些Java语言中不同类型的变量:

 message of type string
 timestamp of type time
 count of type integer
 version of type integer
Run Code Online (Sandbox Code Playgroud)

如果您使用HashMap,例如:

HashMap<String,Object> yourHash = new HashMap<String,Object>();
yourHash.put("message","message");
yourHash.put("timestamp",timestamp);
yourHash.put("count ",count);
yourHash.put("version ",version);
Run Code Online (Sandbox Code Playgroud)

如果你想使用你的哈希:

for(String key : yourHash.keySet()){
  String message = (String) yourHash.get(key);
  Datetime timestamp= (Datetime) yourHash.get(key);
  int timestamp= (int) yourHash.get(key);
}
Run Code Online (Sandbox Code Playgroud)


Dro*_*gba 18

定义一个类来存储您的数据

public class YourDataClass {

    private String messageType;
    private Timestamp timestamp;
    private int count;
    private int version;

    // your get/setters
    ...........
}
Run Code Online (Sandbox Code Playgroud)

然后初始化你的地图:

Map<Integer, YourDataClass> map = new HashMap<Integer, YourDataClass>();
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是正确的,但这个答案却破坏了OP问题的全部目的.将这些值放入Map对象的目的正是避免创建大量的类,并且可以根据需要灵活地在地图中添加任意数量的条目. (11认同)

Wil*_*ill 5

创建一个具有以下属性的对象,并使用适当的名称

  1. 信息
  2. 时间戳记
  3. 计数

并将其用作地图中的值。

如果您不希望将对象相等性用于比较(例如,将值插入到地图中),也可以考虑相应地覆盖equals()hashCode()方法。

  • 很好的建议,但是equals()和hashCode()并不重要,因为他的键是Integer。 (2认同)