簡體   English   中英

如何從Map中獲取值 <String List<Object> &gt;

[英]How can I get the values from Map<String List<Object>>

我有一個看起來像這樣的模型類EmployeeBaseData.java (這僅是示例):

public class EmployeeBaseData {
public EmployeeBaseData(String sid){
    this.sid = sid;

}
private String sid;
private int actualHours = 10;
private int regularHours = 9;
private int overtime = 1;
public String getSid() {
    return sid;
}
public void setSid(String sid) {
    this.sid = sid;
}
public int getActualHours() {
    return actualHours;
}
public void setActualHours(int actualHours) {
    this.actualHours = actualHours;
}
public int getRegularHours() {
    return regularHours;
}
public void setRegularHours(int regularHours) {
    this.regularHours = regularHours;
}
public int getOvertime() {
    return overtime;
}
public void setOvertime(int overtime) {
    this.overtime = overtime;
}

這是控制器:

public class InputController {

public static void main(String[] args) {

    try {

        Map<String, List<Object>> employeeMap = new HashMap<String, List<Object>>();
        EmployeeBaseData base_data1 = new EmployeeBaseData("e774801");
        EmployeeBaseData base_data2 = new EmployeeBaseData("e774802");
        List<Object> valSetOne = new ArrayList<Object>();
        List<Object> valSetTwo = new ArrayList<Object>();
        valSetOne.add(base_data1);
        valSetTwo.add(base_data2);
        employeeMap.put("e774801", valSetOne);
        employeeMap.put("e774802", valSetTwo);
        for(Map.Entry<String, List<Object>> entry : employeeMap.entrySet()){
            String key = entry.getKey();
            List<Object> value= entry.getValue();

        }

現在的問題是,如果我需要訪問模型的getOverTime()方法,那么如何從地圖中獲取它?

關於地圖的正確定義,@ epoch有正確的想法。 值得指出的是,Java 8為您提供了一種非常優雅的方式來獲得所有的加班時間,而不必編寫麻煩的循環:

List<Integer> overtimes = 
    employeeMap.values()
               .stream()
               .flatMap(Collection::stream)
               .map(EmployeeBaseData::getOvertime)
               .collect(Collectors.toList());

您的問題是您將Object作為ArrayList的通用類型,應在List指定數據類型,即:

    Map<String, List<EmployeeBaseData >> employeeMap = new HashMap<String, List<EmployeeBaseData >>();

    EmployeeBaseData base_data1 = new EmployeeBaseData("e774801");
    EmployeeBaseData base_data2 = new EmployeeBaseData("e774802");

    List<EmployeeBaseData > valSetOne = new ArrayList<>();
    List<EmployeeBaseData > valSetTwo = new ArrayList<>();

    valSetOne.add(base_data1);
    valSetTwo.add(base_data2);

    employeeMap.put("e774801", valSetOne);
    employeeMap.put("e774802", valSetTwo);

    for(Map.Entry<String, List<EmployeeBaseData>> entry : employeeMap.entrySet()){
        String key = entry.getKey();
        List<EmployeeBaseData> value = entry.getValue();

        // access objects here:
        for (EmployeeBaseData a : value) {
            a.getOverTime();
        }
    }

我同意時代的回答。 (即使用List<EmployeeBaseData>

另外,如果您還想在列表中存儲其他類型的對象,則可以使用List<Object> 在這種情況下,您只需檢查類型執行強制轉換

   for(Map.Entry<String, List<Object>> entry : employeeMap.entrySet()){
        String key = entry.getKey();
        List<Object> valueList = entry.getValue();
        for (Object item : valueList)
        {
          // CHECK THE TYPE
          if (item instanceof EmployeeBaseData)
          {
             // PERFORM A CAST
             EmployeeBaseData ebd = (EmployeeBaseData) item;
             int overtime = ebd.getOverTime();
          }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM