【问题标题】:Hashmap holding different data types as values for instance Integer, String and ObjectHashmap 保存不同的数据类型作为值,例如 Integer、String 和 Object
【发布时间】:2013-01-13 23:48:45
【问题描述】:

我需要创建一个键为整数的哈希图,它应该包含多个不同数据类型的值。例如,如果键是 msg id,值是

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

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

【问题讨论】:

  • 您需要创建一个包含所有信息的类,然后使用Map<Integer, YourClass>
  • 如果您的所有变量都是 Object 类型,那么您可以将其创建为 Map
  • 这个问题有两种解读方式:(1)如何让每个HashMap元素代表一个数据集合;(2)如何创建一个HashMap,其中元素的类型不统一。我相信预期的意思是#1,但我很感激#2的答案。

标签: java types hashmap


【解决方案1】:

使用适当的名称创建一个包含以下属性的对象。

  1. 留言
  2. 时间戳
  3. 计数
  4. 版本

并将其用作地图中的值。

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

【讨论】:

  • 好建议,但equals()hashCode() 并不重要,因为他的密钥将是Integer
  • 同意,没有必要将其用作值,但我猜他可能想比较从地图中检索到的值。其次,这是一种很好的做法。无论如何我都会这样做。
  • 我同意这是一种很好的做法,并赞成您的回答。但是,一旦 OP 从地图中读取这些对象,我们就不知道他想对它们做什么。
  • 第一个正确答案+1,但德罗巴的答案更容易阅读。
  • 我也同意@jlordo。如果您提请注意特定方法(例如equals()),您需要解释为什么这很重要。仅仅强调最佳实践往往会使答案不必要地膨胀。
【解决方案2】:

先定义一个类来存储你的数据

public class YourDataClass {

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

    // your get/setters
    ...........
}

然后初始化你的地图:

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

【讨论】:

  • 虽然正确,但这个答案违背了 OPs 问题的全部目的。将这些值放入 M​​ap 对象的目的正是避免创建大量的类,并且可以根据需要灵活地在映射中添加任意数量的条目。
  • 嗯。它回答了所提出的问题。
【解决方案3】:

如果你没有自己的数据类,那么你可以如下设计你的地图

Map&lt;Integer, Object&gt; map=new HashMap&lt;Integer, Object&gt;();

在从 MAP 检索值时,不要忘记使用“instanceof”运算符。

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

Map&lt;Integer, YourClassName&gt; map=new HashMap&lt;Integer, YourClassName&gt;();

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 + "]";
    }

}

【讨论】:

  • 你能不能给我提供一个例子来创建下面这样的 hashmap 并从中添加、搜索和检索值 "Map map=new HashMap(); "
  • 是的,当然..请找到编辑后的答案..这个例子只是关于如何在HashMap中添加、搜索、检索值。
【解决方案4】:

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

 message of type string
 timestamp of type time
 count of type integer
 version of type integer

如果你使用像这样的 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);

如果你想使用yourHash:

for(String key : yourHash.keySet()){
  String message = (String) yourHash.get(key);
  Datetime timestamp= (Datetime) yourHash.get(key);
  int timestamp= (int) yourHash.get(key);
}

【讨论】:

    【解决方案5】:

    像下面这样简单......

    HashMap<String,Object> yourHash = new HashMap<String,Object>();
    yourHash.put(yourKey+"message","message");
    yourHash.put(yourKey+"timestamp",timestamp);
    yourHash.put(yourKey+"count ",count);
    yourHash.put(yourKey+"version ",version);
    

    返回时对值进行类型转换。 例如:

        int count = Integer.parseInt(yourHash.get(yourKey+"count"));
    //or
    int count = Integer.valueOf(yourHash.get(yourKey+"count"));
    //or
    int count = (Integer)yourHash.get(yourKey+"count"); //or (int)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      相关资源
      最近更新 更多