【问题标题】:How to split the elements of a Java Object?如何拆分 Java 对象的元素?
【发布时间】:2019-11-26 22:32:53
【问题描述】:

这可能是一个愚蠢的问题,但由于我对 Java 缺乏了解(仍然是它的初学者),我需要一些帮助来阅读对象的元素。有一种方法不仅返回实体,还返回字符串,我无法读取/迭代它。我已经尝试了一些来自互联网的解决方案,但没有一个能满足我的需要。我可能做错了什么,所以如果这是一个愚蠢的问题,再次抱歉。

让我确切地分享该方法返回的内容 here

如您所见,我在位置 0 上有 ChecklistRequest,在位置 1 上有一个字符串(“--”)。我需要阅读它们,因为我需要在此之后操作它们。

提前致谢!

【问题讨论】:

  • 欢迎来到 StackOverflow Paulo!请仔细阅读创建MVE 以便我们可以看到您正在使用的代码。
  • 这不是一个愚蠢的问题,只要你充分解释你想要做什么!没有信息,我们无法帮助您。 “我无法阅读/迭代它”是什么意思?读取和迭代可能意味着很多事情,可以像 for 循环一样简单,也可以像反序列化一样复杂。你需要准确地解释你想要做什么。在进入技术细节之前,请退后一步。用简单的英语来说,你的问题是什么,你的目标是什么?然后解释你是如何尝试编程的以及哪里出了问题
  • 提示@Brydenr 如果你写[mre],它将自动扩展为minimal reproducible example
  • @Frakcool mind == 吹

标签: java arrays object element


【解决方案1】:

要获取对象的特定元素,可以使用格式“objectName.certainElement”

然而,很多时候,实际变量是私有的,因此您无法从类本身外部访问它们。该类必须提供“getter 和 setter”,您可以调用 objectName.getElement() 来获取该特定元素。

在您的情况下,请求是一个充满 E 的 DistinctResultList。我敢打赌 DistinctResultList 只是 ArrayList 的包装器。为了得到你正在寻找的对象,你必须这样做。

checklistRequest = requests.get(0)[0]; //Get the first object at position 0 of arraylist, then the index at position 0 of that object.
secondString = requests.get(0)[1];

要编辑它们的值,假设它们是公开的,

request.get(0)[0] = otherChecklistRequest;
request.get(0)[1] = "---";

或者,创建一个新对象并设置索引:

request.set(0, new myObject(otherChecklistRequest, "----"));

当然,您必须修改所有这些以适应您的用例。

不同的对象有不同的方法来获取隐藏在其中的元素。在这种情况下,ArrayList 使用带有索引作为参数的 getter 方法。里面的对象似乎只是一个使用括号的数组。

祝你好运,我希望我能提供帮助,或者至少为你指明正确的方向!

【讨论】:

  • 这太棒了!!非常友好的回答,非常感谢。我不知道为什么 requests.get(0)[0] 对我不起作用,但创建一个新对象就可以了。谢谢!
【解决方案2】:

您看到的是,存储在内部是一个ArrayList<Object[]>。虽然您始终可以将Object 设置为任何其他对象,但如果您想阅读它,则需要显式转换:

Integer i1=1; // upper case Integer (not int), so it is an object
Object o1=i1; // setting Object to any object is okay
//Integer i2=o1; // this will not compile
Integer i2=(Integer)o1; // this will work fine
if(o1 instanceof Integer)
  System.out.println("o1 is Integer: "+(Integer)o1*2);
if(o1 instanceof Double)
  System.out.println("o1 is Double: "+(Double)o1*2);
System.out.println("passed the ifs, let's die");
Double d1=(Double)o1; // this will result in ClassCastException in runtime

(https://ideone.com/qdGtJP)
这就是为什么您无法看到/对request.get(0)[0] 的结果进行操作,因为那仍然是Object,而不是StringCheckListRequest。它需要特定的转换(请注意,Java 中有一个 instanceof 运算符,因此您可以检查某些东西是否真的是您认为的那样 - 因为当它是其他东西时,转换尝试将会失败)

E-s 只是代表 ***E*** 元素,您可以在文档中的任何地方看到它,例如 https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/List.html

模块 java.base
java.util
接口列表

类型参数:
E - 此列表中元素的类型

运行时,Java 不会真正跟踪您为容器类型指定要包含的内容,它会将任何内容放入 List 对象中,然后一脸吃惊地死去:

    List<Integer> il=new ArrayList<>();
    //il.add(new Object()); // this would not compile
    List l=il;
    l.add(new Object()); // this compiles, and runs, so add() does not complain 
    System.out.println("Length: "+il.size());
    System.out.println(il.get(0)+3);

特别是ClassCastException,所以List&lt;Integer&gt;在内部知道它只是存储对象,只有编译器为我们生成一个方便的转换,所以我们可以假装List&lt;Integer&gt;Integers里面。但事实并非如此。
旁注1:这就是List&lt;int&gt;不存在的原因:它需要对象
旁注2:对于字段,可以通过反射获取其“类型参数”(&lt;E&gt;)。


要重现屏幕截图上的类似结构:
public class Test {
    public static class CheckListRequest {}
    public static void main(String[] args) {
        List<Object[]> array=new ArrayList<>();
        array.add(new Object[] {new CheckListRequest(),"--"});
        array.add(new Object[2]);
        System.out.println("Test");

        // would not compile, Object has no length()
        //System.out.println(array.get(0)[1].length());

        // compiles and runs just fine
        System.out.println(((String)array.get(0)[1]).length());
    }
}

例如,如果您在Test 行设置断点,您可以在调试器中看到非常相似的结构。

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多