網頁

2019/5/1

Java 如何在Map中放入多種型別的值

如果要在Java的Map中放置多種型別的值,做法如下。

例如想要在Map中放入IntegerDate兩種型態的值,通常想到的方法是以Object來存放,因為所有的型別皆繼承Object

Map<String, Object> map = new HashMap<>();
Object o1 = 1;
Object o2 = new Date();

map.put("key1", o1);
map.put("key2", o2);

Integer v1 = (Integer) map.get("key1");
Date v2 = (Date) map.get("key2");

System.out.println(v1); // 1
System.out.println(v2); // Thu May 02 12:21:34 CST 2019

// 跑迴圈
for (Entry<String, Object> e : map.entrySet() ) {
    if (e.getValue() instanceof Integer) {
        System.out.println(e.getValue());
    }
    if (e.getValue() instanceof Date) {
        System.out.println(e.getValue());
    }
}


或是key值可改用Class來放,當然值還是Object

// 放入
Map<Class<?>, Object> map = new HashMap<>();
map.put(Integer.class, 1);
map.put(Date.class, new Date());

// 取出
Integer v1 = (Integer) map.get(Integer.class);
Date v2 = (Date) map.get(Date.class);
        
System.out.println(v1); // 1
System.out.println(v2); // Thu May 02 12:45:34 CST 2019

// 跑迴圈
for (Entry<Class<?>, Object> e : map.entrySet() ) {
    if (e.getValue() instanceof Integer) {
        System.out.println(e.getValue());
    }
    if (e.getValue() instanceof Date) {
        System.out.println(e.getValue());
    }
}

但個人認為最好的方法還是依業務邏輯設計一個容器類別來放多種型別的資料,不過最大的問題在於這個容器類別名稱通常很難給予一個適當的命名。

public class App {

    public static void main(String[] args) throws Exception {

        Map<String, Box> map = new HashMap<>();
        Box box = new Box (1, new Date());
        
        map.put("key1", box);
        
        System.out.println(box.getI()); // 1
        System.out.println(box.getD()); // Thu May 02 12:51:39 CST 2019
        
    }
}

class Box {
    
    Integer i;
    Date d;
    
    public Box (Integer i, Date d) {
        this.i = i;
        this.d = d;
    }

    public Integer getI() {
        return i;
    }

    public void setI(Integer i) {
        this.i = i;
    }

    public Date getD() {
        return d;
    }

    public void setD(Date d) {
        this.d = d;
    }
    
}

參考:

沒有留言:

張貼留言