2009-05-20 5 views
2

У меня есть метод, который возвращает список документов, состоящий из всех этих атрибутов:Array/список расспрашивает

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 установлен?
Любые предложения или примеры кода будут оценены.

ответ

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]) 
+0

Используйте общий список List вместо этого, и вы можете оптимизировать, передав массив правильной длины toArray (новый DocumentSummary [domainDocuments .size()]). –

+0

Здесь есть одна небольшая коррекция: цикл for должен запускаться в 'dtoDocuments.length'. Vivia La использовал массив результатов для цикла. – rudolfson

+0

Арне размер не известен, поскольку список заполняется на основе условия, и нигде пользователь не упомянул, что он использует 1,5 или выше, поэтому решение основано на его коде. –

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

Одна незначительная поправка здесь: цикл for должен использовать 'dtoDocuments'. Vivia La использовал результирующий массив для цикла – rudolfson

+1

Или даже лучше, я просто привяжусь к resultDto и удалю еще одну строку кода. Хороший улов. – Oli

-1

это зависит. если вы имеете в виду от функции вы поставите выше, просто замените:

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

с:

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

Я считаю, что код Java, а не C#. :-) – JesperE

+0

Ugh. это приведет к разреженному массиву, который, я считаю, не тот, о котором хотел автору вопроса. –

+0

'ugh' ... Он сказал, что это то, чего он хотел ... ему нужны только те предметы ... Как будто вы будете отвлекаться на преданного за свою собственную ошибку. Кроме того, не понимал, что это java:) –

0

Во-первых, вы должны действительно использовать общий список вместо массива, если это возможно. Если вы не можете изменить подпись метода, я бы по-прежнему использовал общий список для создания содержимого списка, а затем преобразовал общий список в массив с помощью Collections.toArray().

0

Если я хочу, вы бы хотели добавить только те элементы в результирующий массив, которые имеют document.displayOnAccessIndicator == true. Поскольку это может быть легко проверено в for-loop, я думаю, ваша проблема заключается в обработке массива результатов.

Я настоятельно рекомендую использовать интерфейсы коллекции 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; 
0

Если вы хотите использовать списки, см. Одно из приведенных выше предложений (лично мне нравится лучший Оли). Вы можете улучшить производительность с помощью конструктора ArrayList, как это:

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

где DISPLAY_ON_ACCESS_PREDICTION либо:

  • 1 (целое), если ваши наборы результатов не огромны, и вы не заботиться о немного дополнительной памяти.
  • Постоянная, основанная на ваших знаниях в системе.
  • Если производительность действительно важна - переменная, основанная на истории (средняя, ​​скользящая средняя и т. Д.) Или предсказание (если вы можете сделать это раньше времени).

Кроме того, вы можете использовать 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; 
Смежные вопросы