【问题标题】:How to return all values while iterating through list? [closed]遍历列表时如何返回所有值? [关闭]
【发布时间】:2013-05-30 21:02:01
【问题描述】:

public Details getDetails(String id) throws InvokerException { 详细信息 details = new Details();

try {

    URL url = new URL(BaseUrl, "/cxf/query/ask?id=" + id);
    LOGGER.trace("URL: {}", url);

    String xml = queryStore(url);
    LOGGER.trace("Query result: {}", xml);

    details = new Details();
    InputSrc source = new InputSrc(new StringReader(xml));
        ResultsContentHandler handler = new ResultsContentHandler();

    XMLReader reader = XMLReaderFactory.createXMLReader();
    reader.setContentHandler(handler);
    reader.parse(source);

    for (Hashtable<String,String> result : handler.getResultSet()) {
        String baseId = result.get("baseId");
        ArrayList<Details> list = getHistoryDetails(baseId );

        for(Details t : list) {
        details.setStatus(t.getStatus());
        }
    }
} catch (Exception e) {
    throw new InvokerException(e);
}
return details;

}

我想要实现的是返回 Arraylist 中所有项目的详细信息。例如,我希望获得多个状态,但目前我只获得一种状态。

细节类

public class Details {
    private Core core;
    private String department;
    private GregorianCalendar timestampReceived;
    private GregorianCalendar timestampReported;
    private String status;
    private GregorianCalendar timestampStatus;
    private String explanation;

    public Details(){}

    public Details(Core core,
            String department, GregorianCalendar timestampReceived,
            GregorianCalendar timestampReported, String status,
            GregorianCalendar timestampStatus, String explanation) {
        super();
        this.core = core;
        this.department = department;
        this.timestampReceived = timestampReceived;
        this.timestampReported = timestampReported;
        this.status = status;
        this.timestampStatus = timestampStatus;
        this.explanation = explanation;
    }
    public Core getCore() {
        return core;
    }

    public String getDepartment() {
        return department;
    }
    public GregorianCalendar getTimestampReceived() {
        return timestampReceived;
    }

    public GregorianCalendar getTimestampReported() {
        return timestampReported;
    }

    public String getStatus() {
        return status;
    }

    public GregorianCalendar getTimestampStatus() {
        return timestampStatus;
    }

    public String getExplanation() {
        return explanation;
    }

    public void setCore(Core core) {
        this.core = core;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public void setTimestampReceived(GregorianCalendar timestampReceived) {
        this.timestampReceived = timestampReceived;
    }

    public void setTimestampReported(GregorianCalendar timestampReported) {
        this.timestampReported = timestampReported;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTimestampStatus(GregorianCalendar timestampStatus) {
        this.timestampStatus = timestampStatus;
    }

    public void setExplanation(String explanation) {
        this.explanation = explanation;
    }


}

【问题讨论】:

  • 那么您不会像您认为的那样填充 ArrayList。改变你的期望或调查它们。我们不会为你做这件事。
  • 很多人会说改为返回List&lt;Detail&gt;Detail detail = new Details();移入循环,然后填写您的列表有了这个新实例,但看起来你还没有自己尝试过任何东西......
  • 这是什么Details 类?它是如何工作的?给我们看一些代码!
  • @Code-Guru 与解决问题无关。
  • @LuiggiMendoza 当然是。如果 Details 类保留了多个项目的列表,则 OP 可能会错误地使用它。另一方面,如果 Details 只是一个项目,那么 OP 需要推出自己的解决方案(很可能使用某种 List)。

标签: java arraylist iterator


【解决方案1】:

你不能在一个方法的调用中返回多个值,但是你应该做的是返回一个 ArrayList:

public List<Details> getDetails(String id) throws InvokerException {
    List<Details> details = new ArrayList<Details>();

    try {

        URL url = new URL(BaseUrl, "/cxf/query/ask?id=" + id);
        LOGGER.trace("URL: {}", url);

        String xml = queryStore(url);
        LOGGER.trace("Query result: {}", xml);

        InputSrc source = new InputSrc(new StringReader(xml));
            ResultsContentHandler handler = new ResultsContentHandler();

        XMLReader reader = XMLReaderFactory.createXMLReader();
        reader.setContentHandler(handler);
        reader.parse(source);

        Details detail;
        for (Hashtable<String,String> result : handler.getResultSet()) {
            String baseId = result.get("baseId");
            ArrayList<Details> list = getHistoryDetails(baseId );

            for(Details t : list) {
            detail = new Details();
            detail.setStatus(t.getStatus());
            details.add(detail);
            }
        }
    } catch (Exception e) {
        throw new InvokerException(e);
    }
    return details;
}

【讨论】:

  • 我不明白为什么要创建一个新的Detail 实例只是为了设置status 属性然后将其添加到列表中。为什么不将整个 detail 对象从 ArrayList&lt;Details&gt; list 添加到 details 中?
  • 我同意你的看法,但由于不是我的代码,我尝试将其更正为与他给我们的代码一样接近:),也许他只想要状态而不是对象可以携带的所有信息.
  • Status 只是 Details 类拥有的项目之一。
  • 那么您可能正在寻找的回报是一个 ArrayList
【解决方案2】:

您需要返回List&lt;Details&gt;,而不仅仅是详细信息。因此,您希望在代码示例中返回变量“list”。

【讨论】:

  • 如果您分析整个代码,您会看到很多错误,您应该重新编辑此答案并为所有错误提供解决方案。
  • 这可能会让他朝着正确的方向前进。
【解决方案3】:

创建一个ArrayList&lt;Details&gt;() 并向其中添加详细信息。之后,返回此列表。

代码:

List<Details> detailsToReturn = new ArrayList<>();

for (Hashtable<String,String> result : handler.getResultSet()) {
            String baseId = result.get("baseId");
            ArrayList<Details> list = getHistoryDetails(baseId );

            for(Details t : list) {
                Details temp = new Details();
                temp.setStatus(t.getStatus();
                detailsToReturn.add(temp);
            }
        }

return detailsToReturn;

您提供的代码非常不清楚,所以如果这不是您想要的,我建议您为我们清除它。

【讨论】:

    【解决方案4】:

    您只创建 一个 Details 对象(实际上是两个,但第一个被丢弃了)。如果要保留从ArrayList 检索到的每个Details 对象,则需要在每次迭代for 循环时创建一个新的Details 对象。您还应该将这些添加到新的List

    当然,您只需将从getHistoryDetails() 获得的每个ArrayList 附加到一个新列表中,就可以节省大量工作。

    【讨论】:

    • Code-Guru 可以举个例子吗?
    猜你喜欢
    • 2019-12-30
    • 2017-12-10
    • 1970-01-01
    • 2020-06-18
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多