【问题标题】:Array/list questions数组/列表问题
【发布时间】:2009-05-20 07:02:05
【问题描述】:

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

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 的列表,而不是返回整个列表?
任何建议或示例代码将不胜感激。

【问题讨论】:

    标签: java arrays list


    【解决方案1】:

    我会交换所有这些代码:

        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);
    

    【讨论】:

    • 这里有个小修正:for循环需要使用dtoDocuments。 Vivia La 将结果数组用于循环
    • 或者更好的是,我将挂接到 resultDto 并删除另一行代码。不过很好。
    【解决方案2】:

    我假设属性 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])
    

    【讨论】:

    • 使用通用列表 List 代替,您可以通过将正确长度的数组传递给 toArray(new DocumentSummary[domainDocuments .size()]) 来优化。
    • 这里有一个小修正:for 循环需要运行到dtoDocuments.length。 Vivia La 将结果数组用于循环。
    • Arne 大小不知道,因为列表会根据条件填充,并且没有用户提到他使用的是 1.5 或更高版本,因此解决方案基于他的代码。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果我没听错,您只想将那些元素添加到结果数组中,这些元素具有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;
      

      【讨论】:

        【解决方案5】:

        如果您想使用列表,请参阅我上面的建议之一(我个人最喜欢 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;
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            这取决于。如果您的意思是从上面放置的函数中,只需替换:

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

            与:

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

            【讨论】:

            • 呃。这将导致稀疏数组,我认为这不是作者想要的。
            • '呃'......他说这就是他想要的......他只想要那些物品......好像你会因为自己的错误而浪费代表而且,没有' t意识到它是java :)
            猜你喜欢
            • 2012-11-11
            • 2012-02-12
            • 2015-03-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多