数组/列表问题

时间:2009-05-20 07:02:06

标签: java arrays list

我有一个方法可以返回包含所有这些属性的文档列表:

private String activitySource, activitySystemStatus, regionCode, channel,
               creatorUserId, displayOnAccessIndicator, documentLocationCode,
               extraDetails, keywordList, lastUserId, summaryText,
               textTypeIndicator;

以下是方法:

public DocumentSummary[] getDocumentList(String crn, String dateFormat) {
    log.debug("Entering getDocuments() method");
    //
    RetrieveDocumentListRequestDTO requestDto =
            new RetrieveDocumentListRequestDTO();
    RetrieveDocumentListResultDTO resultDto =
            odrUtils.retrieveDocumentList(crn, requestDto);
    Document[] dtoDocuments = resultDto.getDocumentArray();
    //
    DocumentSummary[] domainDocuments =
            new DocumentSummary[dtoDocuments.length];
    //
    for (int count = 0; count < domainDocuments.length; count++) {
        domainDocuments[count] =
                new DocumentSummary(dtoDocuments[count], dateFormat);
    }
    return domainDocuments;
}

如何设置displayOnAccessIndicator只返回一个列表,而不是返回整个列表? 任何建议或示例代码将不胜感激。

7 个答案:

答案 0 :(得分:4)

我会交换所有这些代码:

    Document[] dtoDocuments = resultDto.getDocumentArray();

    DocumentSummary[] domainDocuments = new DocumentSummary[dtoDocuments.length];

    for (int count = 0; count < domainDocuments.length; count++) {
            domainDocuments[count] = new DocumentSummary(dtoDocuments[count], dateFormat);
    }

为此(有些是个人品味):

List<DocumentSummary> arr = new ArrayList<DocumentSummary>();

for (Document doc : resultDto.getDocumentArray())
    if (doc.displayOnAccessIndicator)
        arr.add(doc);

答案 1 :(得分:1)

我假设属性displayOnAccessIndicator属于Document类。您可以尝试这样的事情,可能会有一些语法错误,所以请忽略它们。

List domainDocuments = new ArrayList();
for (int count = 0; count < dtoDocuments.length; count++) {
     if (dtoDocuments[count].isDisplayOnAccessIndicator()) {
          domainDocuments.add(new DocumentSummary(dtoDocuments[count], dateFormat));
     }
}

return domainDocuments.toArray(new DocumentSummary[0])

答案 2 :(得分:0)

首先,如果可能,您应该使用通用列表而不是数组。如果你不能改变方法签名,我仍然会使用通用列表来构建列表的内容,然后使用Collections.toArray()将通用列表转换为数组。

答案 3 :(得分:0)

如果我说得对,你想只将这些元素添加到结果数组中,这些元素有document.displayOnAccessIndicator == true。由于这可以在for循环中轻松检查,我认为你的问题在于处理结果数组。

我强烈推荐使用java集合接口(例如java.util.List)。我假设在这个例子中至少有Java版本5。

Document[] dtoDocuments = resultDto.getDocumentArray();
List<DocumentSummary> domainDocuments = new ArrayList<DocumentSummary>();

for (Document doc : dtoDocuments) {
    if (doc.isDisplayOnAccessIndicator()) { // or doc.getDisplayOnAccessIndicator()
        domainDocuments.add(new DocumentSummary(dtoDocuments[count], dateFormat));
    }
}

// change return type accordingly
// or use return domainDocuments.toArray(new DocumentSummary[domainDocuments.size()]);
return domainDocuments;

答案 4 :(得分:0)

如果您想使用列表,请参阅我上面的建议之一(我个人认为Oli最好)。您可以使用ArrayList构造函数来提高性能,如下所示:

... = new ArrayList<DocumentSummary>(
            dtoDocuments.length * DISPLAY_ON_ACCESS_PREDICTION);

其中DISPLAY_ON_ACCESS_PREDICTION为:

  • 1(int),如果你的结果集不是很大并且你不在乎需要额外的内存。
  • 一个常数,基于您对系统的了解。
  • 如果表现非常重要 - 基于历史(平均值,移动平均值等)或预测的变量(如果您可以提前制作)。

此外,如果模型非常大并且您希望节省内存,则可以使用ArrayList.trimToSize()。

如果你想留在数组中,这里有两个建议:
建议1,假设询问指标状态为“慢”(时间/资源消耗):

//...
DocumentSummary[] domainDocuments = new DocumentSummary[dtoDocuments.length];
int skipped = 0;
for (int count = 0; count < domainDocuments.length; ++count) {
    if (doc.isDisplayOnAccessIndicator()) {
        DocumentSummary summary = new DocumentSummary(dtoDocuments[count], dateFormat);
        domainDocuments[count - skipped] = summary;
    } else {
        ++skipped;
    }
}
//trim the array
DocumentSummary[] result = new DocumentSummary[count - skipped];
System.arrayCopy(domainDocuments, 0, result, 0, count - skipped);
return result;

建议2,假设询问指标状态为“快”(时间/资源不足):

int actualCount = 0;
for (int count = 0; count < domainDocuments.length; ++count) {
    if (doc.isDisplayOnAccessIndicator()) {
        ++actualCount;
    } else {
        ++skipped;
    }
}
DocumentSummary[] domainDocuments = new DocumentSummary[actualCount];
int skipped = 0;
for (int count = 0; count < domainDocuments.length; ++count) {
    if (doc.isDisplayOnAccessIndicator()) {
        DocumentSummary summary = new DocumentSummary(dtoDocuments[count], dateFormat);
        domainDocuments[count - skipped] = summary;
    } else {
        ++skipped;
    }
}
return domainDocuments;

答案 5 :(得分:0)

我不使用数组,而是使用ArrayList(或者更常见的Collection),然后根据谓词进行过滤。见Java: What is the best way to filter a Collection

答案 6 :(得分:-1)

这取决于。如果您的意思是上面提到的功能,只需替换:

domainDocuments[count] = new DocumentSummary(dtoDocuments[count], dateFormat);

使用:

if (!string.IsNullOrEmpty(dtoDocuments[count].displayOnAccessIndicator))
    domainDocuments[count] = new DocumentSummary(dtoDocuments[count], dateFormat);