Collections.sort () не вызывается / не выполняется, т.е. не входит только в этот метод - PullRequest
0 голосов
/ 16 июня 2019

Я использую метод Collections.sort () для сортировки списка записей по временному полю. Но выполнение моей программы не входит только в этот метод.Я получаю список записей объекта лечения из моей базы данных, который храню в переменной list .Я фильтрую эти записи, основываясь на некоторых параметрах, и храню отфильтрованные в списке дозировки , который имеет тип DosagaData.После этого мне нужно отсортировать отфильтрованный список на основе поля time , для которого я использовал Collections.sort (), который не вызывается.

'' '

private List<TreatmentObject> list;
private List<DosageData> dosages;

for (int i = 0; i < list.size(); i++) {
DosageData dosage = new DosageData(list.get(i));
System.out.println("Dosage data is" +  dosage);
if(dosage != null) {
   dosages = new ArrayList<DosageData>();
   dosage.dosageTime = time;
   System.out.println("DosageData time is " + dosage.dosageTime);
   this.dosages.add(dosage);
   this.dosageCount += 1;
  }
}

Iterator<DosageData> dosaegDataIterator = dosages.iterator();

while (dosaegDataIterator.hasNext()) {
  System.out.println("Before Sorting " + dosaegDataIterator.next().dosageTime);
}

Collections.sort(dosages, new Comparator<DosageData>() {
@Override
public int compare(DosageData first, DosageData second) {
System.out.println("Inside Dosage Sorter Class");
Date firstDate = null, secondDate = null;
String firstTimes = first.dosageTime;
System.out.println("First time is" + firstTimes);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSSZZZZZ");
try {
   firstDate = sdf.parse(firstTimes);
   System.out.println("First date is" + firstDate);
} catch (ParseException e) {
   e.printStackTrace();
}
   String secondTimes = second.dosageTime;
   System.out.println("Second time is" + secondTimes);
try {
   secondDate = sdf.parse(secondTimes);
   System.out.println("Second date is" + secondDate);
} catch (ParseException e) {
   e.printStackTrace();
}
System.out.println("Return result is" + firstDate.compareTo(secondDate));
return firstDate.compareTo(secondDate);
}
});

for (DosageData dosage : dosages) {
   System.out.println("After Sorting" + dosage.dosageTime);
}

System.out.println("Sorted Dosages is" +dosages);

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Здесь:

dosages = new ArrayList<DosageData>();

Вы создаете новый список за созданный вами объект DosageData. Поэтому, когда этот список, который вы намереваетесь отсортировать ..., содержит ровно один элемент (поскольку вы помещаете все предыдущие объекты DosageData в отдельные списки, а затем выбрасываете эти списки.

Список с одной записью может быть отсортирован без вызова какого-либо метода вашего компаратора.

Кроме того, в вашем коде много неправильного:

  • Прежде всего: форматируйте / делайте отступ разумными способами. Грязный код облегчает просмотр ошибок.
  • не используйте 3 разных метода для перебора ваших списков. Прямой способ итерации таких коллекций - использовать foreach , например: for(Treatment treatment : list) { .... Не нужно использовать руководство для цикла, не нужно использовать итератор!
  • это действительно плохая идея, что Comparator должен знать формат , который есть у ваших временных меток.

Руководство: помните, что ваш compare() метод может вызываться много раз. Теперь обратите внимание, что этот метод создает средство форматирования данных и выполняет разбор двух дат. Каждый раз, когда это называют. Это не проблема, если в вашем списке есть 100 или 1000 записей. Но если вы говорите об элементах списка 100 КБ, то что-нибудь , которое вы делаете в compare(), имеет значение для производительности. Таким образом: когда вы имеете дело с большими списками, подумайте о том, чтобы ваш класс реализовал интерфейс Comparable и вычислял эту временную метку только один раз, во время создания объекта, чтобы избежать повторного форматирования и анализа.

Другими словами: ваш дизайн был бы намного чище, если бы объект DosageData уже содержал реальный объект Date вместо другого кода, который постоянно анализировал / форматировал строки. Весь этот код должен знать, какой формат использовать. Это плохая идея!

Наконец: наступил 2019 год. Узнайте о замечательных новых классах Date / Time, которые были добавлены в Java 8! Возможно, вы также захотите узнать о потоках, так как весь ваш исходный код может быть записан как

private List<DosageData> dosages = list.stream()
  .map(t -> new DosageData(t))
  .collect(Collectors.asList());

Вот и все.

1 голос
/ 16 июня 2019

Вы создаете новый ArrayList в цикле for: dosages = new ArrayList<DosageData>();:

for (int i = 0; i < list.size(); i++) {
    DosageData dosage = new DosageData(list.get(i));
    System.out.println("Dosage data is" +  dosage);
    if(dosage != null) {
       dosages = new ArrayList<DosageData>();  // ***** HERE ******
       dosage.dosageTime = time;
       System.out.println("DosageData time is " + dosage.dosageTime);
       this.dosages.add(dosage);
       this.dosageCount += 1;
      }
}

и поэтому этот список будет содержать один и только один элемент DosageData. Нет необходимости сортировать ArrayList только внутри одного элемента, и Java это знает.

Решение: создайте ArrayList перед циклом for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...