我有一个方法可以返回包含所有这些属性的文档列表:
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只返回一个列表,而不是返回整个列表? 任何建议或示例代码将不胜感激。
答案 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为:
此外,如果模型非常大并且您希望节省内存,则可以使用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);