2017-01-31 4 views
1

Я ожидал получить наименьшее время выполнения, но вместо этого он печатает самую последнюю строку в списке arrayList. Я пытаюсь напечатать конкретный курс для собак, и это работает, когда я вхожу в код курса. Однако самое низкое время работы, похоже, не работает.Как напечатать самое низкое значение в списке массивов с помощью ООП?

пример данные

Лазли 12,2

Rin 34,2

Ю. 23,3 - Это будет напечатан как победившая собака, когда Ласло должна быть выигрышной собакой.

Победившая собака должна иметь наименьшее время выполнения, но вместо этого берет последнюю строку чтения и печатает ее.

private void winningDog(String dogsCode) 
{ 
    double runTime = 300; 
    String winningDog = ""; 
    double winningTime = 0; 
    for (Dogs dog: dogsList) 
    { 
     if(runTime > dog.getTotalTime() && (dog.getCourseCode().equalsIgnoreCase(dogsCode))) 
     { 
      winningTime = dog.getTotalTime(); 
      winningDog = dog.getName(); 
     } 

    } 
    System.out.printf("%n%s%17s%20s%1.2f%n", 
      "Winning dog", winningDog,"Time " , winningTime); 

} 
+0

Здравствуй! Добро пожаловать в переполнение стека! На пути к программированию вы обнаружите, что отладка - очень ценное умение. Вначале очень важны печатные переменные. Мой намек - напечатать переменные в начале цикла for. – jeff

ответ

0

Предполагая, что вы не имеют отрицательные значения для dog.getTotalTime(), вы можете изменить свой код

winningTime = Double.MAX_VALUE; //assigning MAX value to ensure the condition is met at least once(unless all your time values are MAX_VALUE) 

, а затем обновить состояние как

if(runTime > dog.getTotalTime().. 

в

if(winningTime > dog.getTotalTime().. // this would compare winningTime and you're setting the same is the condition matches 
+0

он работает, но берет на себя наибольшее значение :( –

+0

@NicoRobin обновил ответ. Пожалуйста, посмотрите. – nullpointer

+0

Спасибо, я никогда раньше не использовал этот код, но он исправил мою проблему :). Огромное спасибо. –

0

Что вы пытаетесь сделать, это в основном найти минимальное поле какого-либо объекта. Вы можете сделать это в одной строке, используя новый Java 8 Stream API.

Dogs winningDog = dogsList.stream().min(Comparator.comparingInt(Dogs::getTotalTime)).get(); 

Ваш класс Dogs должен вероятно быть Dog. Я просто основываю свой ответ на основе расширенного цикла for, где он говорит Dogs dog: dogsList.

Ваш фильтр в контуре может быть легко привязан к вызову, добавив .filter(CONDITIONS) между .stream() и .min().

+0

Я бы использовал 'Collections.min()'. – shmosel

+0

'Comparator.comparingDouble()' вместо сравнения времени. – nullpointer

+0

@shmosel, используя этот код, похоже, не похоже на затмение. Раньше я пытался использовать Collections.sort, но это дало мне ошибку даже при импортированном пакете. –

0
private void winningDog(String dogsCode) { 
    String winningDog = ""; 
    double winningTime = 0; 
    if (dogsList != null) { 
     winningTime = dogsList.get(0).getTotalTime(); 
     winningDog = dogsList.get(0).getName(); 
     if (dogsList.size() > 1) { 
      for (int i = 1; i < dogsList.size(); i++) { 
       if (dogsList.get(i).getTotalTime()< winningTime 
         && (dogsList.get(i).getCourseCode().equalsIgnoreCase(dogsCode))) { 
        winningTime = dogsList.get(i).getTotalTime(); 
        winningDog = dogsList.get(i).getName(); 
       } 

      } 
     } 
    } 
    System.out.printf("%n%s%17s%20s%1.2f%n", "Winning dog", winningDog, "Time ", winningTime); 
} 
+0

Я сделал. Tho это печать наивысшего значения, а не самого низкого значения. –

+0

@ Hiccup Значок компаратора в 'if' кажется неправильным. Он должен быть '>' – nullpointer

+0

Спасибо @nullpointer. исправил его – Hiccup