【问题标题】:Java Access an Array in an objectJava 访问对象中的数组
【发布时间】:2021-02-20 16:09:12
【问题描述】:

我有一个方法 (validateaddress) 将 HashMap 返回到另一个方法 (validateapplicant)。

“validateaddress”将{success=false, payload=[]}返回给“validateapplicant”

如何访问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;
}

【问题讨论】:

  • ((ArrayList&lt;propertymodel&gt;)(validateaddress(property).get("payload")) 一样投射它怎么样?但不管怎样,你为什么要改用Map 而不是为此开设课程?
  • 虽然在您的情况下可以进行强制转换,但 HashMap 并不是为此目的而制作的。

标签: java arrays hashmap


【解决方案1】:

要访问第一个索引,您必须首先将“validateaddress(property).get("payload")”转换为 ArrayList。

((ArrayList<propertymodel>) validateaddress(property).get("payload")).get(0) 

应该可以解决问题。

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

【讨论】:

  • 转换为HashMap&lt;String,ArrayList&gt; 是错误的,因为Map 的值并不总是ArrayList。此外,您不应使用原始类型。
  • 但是这个案例是真的,对吧?我认为你这样做不会有任何问题。但是,如果您想更加谨慎,可以使用 List 代替。
  • 这个案例是真的。 HashMap 包含键 "success" 的布尔值。
  • 如果只有 ArrayList 有效载荷为“成功”时,您可以对其进行条件处理,它会正常工作。只写一个if条件,If(validateaddress(property).get("payload").equals("success")){ // 强制转换代码 }
  • 看问题。 Map 中有 另一个 条目,其中键是 success,值是布尔值。
【解决方案2】:

如果您知道您的“对象”是 ArrayList 类型,为什么不将地图声明为 HashMap&lt;String, ArrayList&gt;

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

HashMap<String, ArrayList> validation = validateaddress(property);
for(Entry<String, ArrayList> list : validation.entrySet()) {
    list.getValue().get(0); // return 1st index
}

编辑:正如 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");
    }
}   

为简单起见,我在 ArrayList 中使用了 String 对象。顺便说一句:propertymodel 应该大写,因为它是一个类

【讨论】:

  • 因为该列表还包含一个Boolean 值。此外,您不应使用原始泛型类型。
  • 您可以只使用instanceof 而不是等待ClassCastException。但是,请注意,泛型在运行时不存在,并且强制转换仍然是未检查的(与 try-catch 相同)。另外,当您只需要键 payload 的值时,为什么要遍历 Map 的所有值?
  • @dan1st 是的——你也可以使用 instanceof,但就 JVM 而言,try-catch 更“划算”。这是最好的方法吗?有人可以争论。据我了解,OP 想要访问每个数组中的第一个索引。如果是这种情况,您必须进行迭代。
【解决方案3】:

validateaddress() 返回HashMap&lt;String, Object&gt;,其中success 指向Booleanpayload 指向ArrayList&lt;propertymodel&gt;

如果您使用validateaddress(property).get("payload"),编译器会看到它返回一个Object,并且不知道这是什么类型的对象。

肮脏的方法

您可以将其转换为 ArrayList&lt;propertymodel&gt;,如下所示:

ArrayList<propertymodel> model=((ArrayList<propertymodel>)validateaddress(property).get("payload"))

但是,这不是一种安全的方法,编译器甚至会告诉您这是未经检查的强制转换。

问题在于,如果您犯了错误,那么 Object 可能不是 ArrayList&lt;propertymodel&gt;,而编译器不可能发现此类错误。

相反,您应该使用面向对象的编程或异常。

使用 OOP 来提高类型安全性

您可以创建一个不同属性具有不同类型的类,而不是创建一个值由多种类型组成的HashMap

public class AddressValidationResult{
    private final boolean success;
    private final ArrayList<propertymodel> payload;
    public AddressValidationResult(boolean success,ArrayList<propertymodel> payload){
        this.success=success;
        this.payload=payload;  
    }
    public boolean isSuccessfull(){
        return success;
    }
    public ArrayList<propertymodel> getPayload(){
        return payload;
    }
}

然后您可以返回此类的一个实例并使用 getter 来安全地检索数据。

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

public AddressValidationResult validateaddress(propertymodel property){
    
    propertymodel suggestion = new propertymodel();

    suggestion.setStreet1("Some Street");

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

    payload.add(suggestion);

    return new AddressValidationResult(false,payload);
}

之后,您可以使用validateaddress(property).getPayload()安全地访问它

例外情况

HashMap 只包含一个成功变量,payload 包含实际数据。

您可以只返回实际数据并在验证失败时抛出异常,而不是返回这样的Map

但是,这可能不适合您,因为如果验证失败,您将没有 payload

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2018-04-16
    • 2023-03-30
    相关资源
    最近更新 更多