如何在Java中将Map<String, string>添加到Map<String, List<Object>>中

3
public Map<String, List<PatientInfo>> getPatients(String sendingApplication,String sendingFacility) {
        // TODO Auto-generated method stub
        Map<String, List<PatientInfo>> patientMap = null;
        List<PatientInfo> patientList = null;
        patientMap = new HashMap<String, List<PatientInfo>>();
        patientList = new ArrayList<PatientInfo>();
        try {
        PatientInfoDAO patientInfoDAO = new PatientInfoDAOImpl();
        ItemCollection<QueryOutcome> items = patientInfoDAO.getPatients(sendingApplication, sendingFacility);

        for(Item item : items){
            PatientInfo patient = new PatientInfo();
            patient.setAdministrativeSex(item.getString(""));
            patient.setFamilyName(item.getString("FAMILYNAME"));
            patient.setGivenName(item.getString("GIVENNAME"));
            patient.setAdmitDateOrTime(item.getString("GENDER"));
            patient.setAssignedPatientLocationBuilding(item.getString("USERNAME"));
            patient.setAssignedPatientLocationFloor(item.getString("PASSWORD"));
            patient.setAssignedPatientLocationPersonLocationType(item.getString("USERROLE"));
            patient.setAssignedPatientLocationRoom(item.getString("USERSTATUS"));
            patient.setAsssignedPatientLocationBed(item.getString("EMAIL"));
            patient.setAttendingDoctor(item.getString("EMROPERATOR"));
            patient.setClientId(item.getString("clientId"));
            patient.setDateOrTimeOfMessage(item.getString("dateOrTimeOfMessage"));
            patient.setDischargeDateOrTime(item.getString("dischargeDateOrTime"));
            patient.setDob(item.getString("dob"));
            patient.setEventOccuredTime(item.getString("eventOccuredTime"));
            patient.setImageUrl(item.getString("imageUrl"));
            patient.setLastModifiedOn(item.getString("lastModifiedOn"));
            patient.setMessageControlId(item.getString("messageControlId"));
            patient.setNrPatientId(item.getString("nrPatientId"));
            patient.setPatientId(item.getString("patientId"));
            patient.setPatientStatus(item.getString("patientStatus"));
            patient.setPriorPatientLocationBed(item.getString("priorPatientLocationBed"));
            patient.setPriorPatientLocationBuilding(item.getString("priorPatientLocationBuilding"));
            patient.setPriorPatientLocationFloor(item.getString("priorPatientLocationFloor"));
            patient.setPriorPatientLocationPersonLocationType(item.getString("priorPatientLocationPersonLocationType"));
            patient.setPriorPatientLocationPointOfCare(item.getString("priorPatientLocationPointOfCare"));
            patient.setPriorPatientLocationRoom(item.getString("priorPatientLocationRoom"));
            patient.setReceivingFacility(item.getString("receivingFacility"));
            patient.setRecevingApplication(item.getString("recevingApplication"));
            patient.setSendingApplicaation(item.getString("sendingApplicaation"));
            patient.setSendingFacility(item.getString("sendingFacility"));

            patientList.add(patient);
        }

        String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        patientMap.put("PATIENTLIST", patientList);
        patientMap.put("LASTKEY", date);


        return patientMap;

        }catch(AmazonServiceException ase){

            throw new RuntimeException("internalServerError");
        }catch(AmazonClientException ase){

            throw new RuntimeException("internalServerError");
        }
    }       

在这种情况下,我无法将日期字符串添加到Map中吗?

1
你不能这样做。最好创建一个自定义对象,包含患者列表和日期,并使用该对象代替映射。你可以将映射声明为Map<String, Object>类型,但这种方法有些可疑。 - Robby Cornelissen
你应该将 return 放在 try 外面。 - vinS
我认为你的代码在patientMap.put("LASTKEY", date);处无法编译。 - KayV
4个回答

4
你正在尝试在需要List的地方放置一个字符串。
请改为:
patientMap.put("PATIENTLIST", patientList);
patientMap.put("LASTKEY", date);

地点:

patientMap.put(date, patientList);

使用以日期字符串为键,患者列表为值的地图,您可以快速获取给定日期的患者列表。


如果你想使用一个地图来保存日期和对象列表的字符串形式,那么你必须将那些字符串转换回它们原来的日期或患者对象列表。

如果这真是你想要的,我建议你研究Java对象序列化和反序列化


{"LASTKEY":"20171211103422", "PATIENTLIST": [ { }, { },] } - Manjunath G
那看起来像是一个对象的签名或序列化版本,该对象具有2个属性:LASTKEY和PATIENTLIST。与Robby Cornelissen在另一个答案中提到的类似。 - Tadija Bagarić
你确定你提供的方法是你所描述的对象所在的位置吗?为什么你的方法签名像 public Map<String, List<PatientInfo>> - Tadija Bagarić

2
以下是您可以做出的小改变,以实现上述目标(当然,您需要更改返回类型):
public Map<String, PatientMapObject> getPatients(String sendingApplication,String sendingFacility) {
    // TODO Auto-generated method stub
    Map<String, PatientMapObject> patientMap = null;
    List<PatientInfo> patientList = null;
    patientMap = new HashMap<String, PatientMapObject>();
    patientList = new ArrayList<PatientInfo>();
    try {

        PatientInfoDAO patientInfoDAO = new PatientInfoDAOImpl();
        ItemCollection<QueryOutcome> items = patientInfoDAO.getPatients(sendingApplication, sendingFacility);

       for(Item item : items){
            PatientInfo patient = new PatientInfo();

            patient.setAdministrativeSex("Male");

            patientList.add(patient);
        }

        String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

        PatientMapObject pmo = new PatientMapObject();
        pmo.setPatientList(patientList);
        pmo.setPDate(date);

        patientMap.put("PATIENTLIST", pmo);
        return patientMap;
    }catch(Exception ase){

        throw new RuntimeException("internalServerError");
    }
}

class PatientMapObject{


    private List<PatientInfo> patientList;
    private String pdate;

    public void setPDate(String pdate) {
        this.pdate = pdate; 
    }

    public void setPatientList(List<PatientInfo> patientList) {
        this.patientList = patientList;
    }

    //getters 
}

0

你只能添加在 Map 的定义中已确定类型的对象(即 List<PatientInfo>,因为你正在创建类似于 Map<String,List<PatientInfo>> 的映射表)如果要添加 String,你应该使用 Map<String,Object>


0

如我在评论中提到的那样,您可以使用类型为Map<String, Object>的映射来保存患者列表和日期。但是这种解决方案存在以下问题:

  1. 它不是类型安全的;
  2. 容易出现映射键名称拼写错误的漏洞;
  3. 每当您从映射中检索项目时,都必须执行转换,如下面的示例所示。
Map<String, Object> patientData = new HashMap<>();
patientData.put("LASTKEY", date);

String lastKey = (String) patientData.get("LASTKEY");

为了避免这一切,以下是我认为最符合惯用法的Java解决方案:创建一个 PatientData 类来保存你的 PatientInfo 列表以及你想要存储的额外日期。
public class PatientData {
    private List<PatientInfo> patientList = new ArrayList<>();
    private Date lastKey; // or better still, use one of the Java 8 date classes

    // getters and setters...
}

这可以保证类型安全,消除了键名拼写错误的风险和强制转换的需要:

PatientData patientData = new PatientData();
patientData.setLastKey(new Date());

Date date = patientData.getLastKey();

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