Java访问对象中的数组

Java访问对象中的数组,java,arrays,hashmap,Java,Arrays,Hashmap,我有一个方法(validateaddress),它将哈希映射返回到另一个方法(ValidateApplication) “validateaddress”将{success=false,payload=[]}返回到“ValidateApplication” 如何访问validateaddress(property.get(“payload”)数组中的第一个索引 public void validateapplicant(application application){ property

我有一个方法(validateaddress),它将哈希映射返回到另一个方法(ValidateApplication)

“validateaddress”将
{success=false,payload=[]}
返回到“ValidateApplication”

如何访问
validateaddress(property.get(“payload”)
数组中的第一个索引

public void validateapplicant(application application){

   propertymodel property = new propertymodel();

   property.setStreet1(application.getApplicant().getStreet1());
   property.setStreet2(application.getApplicant().getStreet2());

   HashMap<String,Object> validation = validateaddress(property).get("payload");
 
   ^^^ How to make validation equal the first index? ^^^
   
}

public HashMap<String, Object> validateaddress(propertymodel property){
    
    propertymodel suggestion = new propertymodel();

    suggestion.setStreet1("Some Street");

    ArrayList<propertymodel> payload = new ArrayList<propertymodel>();

    payload.add(suggestion);

    HashMap<String, Object> response = new HashMap<>();

    response.put("success", false);
    response.put("payload", payload);

    return response;
}

public void validateApplication(应用程序){
propertymodel属性=新的propertymodel();
property.setStreet1(application.getapplicator().getStreet1());
property.setStreet2(application.getapplicator().getStreet2());
HashMap validation=validateaddress(属性).get(“有效负载”);
^^^如何使验证等于第一个索引^^^
}
公共HashMap validateaddress(propertymodel属性){
propertymodel建议=新建propertymodel();
建议:设置街1(“某条街”);
ArrayList有效负载=新的ArrayList();
增加(建议);
HashMap响应=新建HashMap();
回答。put(“成功”,false);
响应。put(“有效载荷”,有效载荷);
返回响应;
}

要访问第一个索引,必须首先将“validateaddress(property).get(“payload”)”强制转换到ArrayList中

((ArrayList<propertymodel>) validateaddress(property).get("payload")).get(0) 
((ArrayList)validateaddress(属性).get(“有效负载”).get(0)
我们应该做到这一点


否则,您也可以从HashMap类型的对象中的validateAddress函数中获取验证值,通过该函数,您不需要强制转换部分,我们必须执行上述操作。

如果您知道您的“对象”是ArrayList类型,为什么不将映射声明为
HashMap

在检索ArrayList对象的第一个索引方面,您可以执行类似的操作

HashMap<String, ArrayList> validation = validateaddress(property);
for(Entry<String, ArrayList> list : validation.entrySet()) {
    list.getValue().get(0); // return 1st index
}
HashMap validation=validateaddress(属性);
对于(条目列表:validation.entrySet()){
list.getValue().get(0);//返回第一个索引
}
编辑:正如dan1st正确指出的,您也有布尔值。在这种情况下,你可以这样做

for (Entry<String, Object> arr : list.entrySet()) {
    try {
        String value = ((ArrayList<String>) arr.getValue()).get(0);
        System.out.println(value);
    } catch (ClassCastException e) {
        System.out.println("not array");
    }
}   
for(条目arr:list.entrySet()){
试一试{
字符串值=((ArrayList)arr.getValue()).get(0);
系统输出打印项次(值);
}catch(ClassCastException e){
System.out.println(“非数组”);
}
}   
为了简单起见,我在ArrayList中使用了String对象。顺便说一句:propertymodel应该大写,因为它的a类

validateaddress()
返回一个
HashMap
,其中
success
指向一个
Boolean
,而
payload
指向一个
ArrayList

如果使用
validateaddress(property).get(“payload”)
,编译器会看到它返回一个
对象,而不知道这是什么类型的对象

肮脏的做法 您可以将其强制转换为
ArrayList
,如下所示:

ArrayList<propertymodel> model=((ArrayList<propertymodel>)validateaddress(property).get("payload"))
然后,您可以返回这个类的一个实例,并使用getter来安全地检索数据

这将是一种在不影响类型安全的情况下解决问题的方法

公共地址验证结果验证地址(propertymodel属性){
propertymodel建议=新建propertymodel();
建议:设置街1(“某条街”);
ArrayList有效负载=新的ArrayList();
增加(建议);
返回新的AddressValidationResult(false,有效负载);
}
之后,您可以使用
validateaddress(property).getPayload()安全地访问它

例外情况
HashMap
仅包含一个success变量,而
payload
包含实际数据

您不必返回这样的
映射
,只需返回实际数据,并在验证失败时引发异常


但是,这可能不适用于您,因为如果验证失败,您将不会有
有效负载。

((ArrayList)(validateaddress(property).get(“有效负载”)那样强制转换它怎么样
?但无论如何,为什么要为此重新生成一个
映射而不是一个类呢?虽然强制转换在您的情况下是有效的,
HashMap
并不是为此目的而生成的。强制转换到
HashMap
将是错误的,因为
映射的值并不总是
数组列表
。此外,您不应该使用原始类型。但这是错误的对于这种情况,s是正确的,对吗?我认为这样做不会有任何问题。但是,如果您想格外小心,可以使用List。对于这种情况,它是正确的。
HashMap
包含键
“success”
的布尔值。如果只有当有效负载为“success”时才有ArrayList您可以对相同的内容执行条件处理,它将正常工作。只需编写一个if条件,if(validateaddress(property).get(“payload”).equals(“success”){//casting code}看看这个问题。
Map
中还有一个条目,其中键是
success
,值是一个布尔值。因为列表中还包含一个
boolean
值。另外,您不应该使用原始泛型类型。啊,对了-没有发现:)您可以使用
instanceof
而不是等待
ClassCastException
。但是,请注意,泛型在运行时不存在,强制转换仍将被取消选中(与try-catch相同)。另外,当您只需要键
有效负载的值时,为什么要迭代
映射的所有值呢?@dan1st yes-您也可以使用instanceof,但是就JVM而言,try-catch更“经济高效”。这是最好的方法吗?可以说。据我所知,OP希望访问每个数组中的第一个索引。如果是这种情况,你必须迭代。