2014-11-02 5 views
0

Это закодировано в BlueJ!Fing самое высокое значение с Collection.max() в HashSet

Привет, ребята, я пытаюсь найти максимальное значение в HashSet. Я пытаюсь использовать метод Collection.max, но он не работает для меня. Я получаю сообщение об ошибке: не найдено подходящего метода для max (int). Ошибка в моем классе VerhuurderBedrijf, последний метод, называемый getLongestRentPeriod.

У меня есть 2 класса, (это голландский) VerhuurderBedrijf и Container. В классе Container у меня есть метод под названием differenceInDays. Здесь он вычисляет разницу в днях между startDate и endDate (см. Поля в классе Container).

В VerhuurderBedrijf я добавляю объекты контейнера в HashSet. В моем getLongestRentPeriod я пытаюсь найти максимальное значение, вычисленное в моем методе differenceInDays (класс контейнера).

Допустим, что в моем классе VerhuurderBedrijf добавлено 2 объекта контейнера.
Контейнер 1 - startDate = 10-10-2014; endDate = 15-10-2014;
Контейнер 2 - startDate = 10-10-2014; endDate = 20-10-2014;
Как я уже сказал, разница в днях рассчитывается в моем методе differenceInDatys (класс Container)/

Так что с моей getLongestRentPeriode (verhuurderbedrijf класс) Я пытаюсь получить наибольшее значение, что будет 11 дней (контейнер 2);

Извините, если не ясно. Я плохо разбираюсь в вещах.

Вот полный код.

VerhuurderBedrijf класс

import java.util.*; 
import java.text.DecimalFormat; 

public class VerhuurderBedrijf 
{ 
    private HashSet<Container> containerList; 
    // Decimalen object 
    DecimalFormat df; 
    /** 
    * Constructor for objects of class VerhuurderBedrijf 
    */ 
    public VerhuurderBedrijf() 
    { 
     containerList = new HashSet<Container>(); 
     // Dit zorgt ervoor dat er 2 decimalen achter de komma komen 
     df = new DecimalFormat("0.00"); 
    } 

    public void addContainer(Container container) 
    { 
     // Voegt een container toe een de HashSet<Container> 
     containerList.add(container); 
    } 

    public void gettotalIncome() 
    { 
     double total = 0; 
     for(Container container : containerList) 
     { 
      total += container.getIncome(); 
     } 
     System.out.println("The total amount of income for the rented containers are:\r\n " + (df.format(total)) + " euros.\r\n"); 
    } 

    public void getAverageVolume() 
    { 
     double average = 0; 
     double calc = 0; 
     for(Container container : containerList) 
     { 
      average += container.getVolume(); 
      calc = average/containerList.size(); 
     } 
     System.out.println("The average volume of the rented container are:\r\n " + (df.format(calc)) + ".\r\n"); 
    } 

    public void getLongestRentPeriod() 
    {  
     for(Container container : containerList) 
     { 
      System.out.println("max : " + Collections.max(container.differenceInDays())); 
     } 
    } 
} 

Контейнерный класс

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class Container 
{ 
    private int volume; 
    private String startDate; 
    private String endDate; 
    // Tijd object 
    SimpleDateFormat format; 

    public Container(int volume, String startDate, String endDate) 
    { 
     this.volume = volume; 
     this.startDate = startDate; 
     this.endDate = endDate; 
     // Dit zet de datum om naar een ddmmjjjj formaat, zo is het mogelijk om bijv: 12102014 in te vullen 
     format = new SimpleDateFormat("ddMMyyyy"); 
    } 

    public int getCosts() 
    { 
     int cost1 = 60; 
     int cost2 = 125; 
     if(volume <= 2) 
     { 
      // Als de volume kleiner of gelijk is aan 2, zijn de kosten voor de container 60 euro 
      return cost1; 
     } 
     else 
     { 
      // Anders zijn de kosten voor de container 125 euro 
      return cost2; 
     } 
    } 

    public int differenceInDays() 
    { 
     int startDateCheck = Integer.parseInt(startDate); 
     int endDateCheck = Integer.parseInt(endDate); 
     if(startDateCheck > endDateCheck) 
     { 
      // Als er een verkeerde invoer wordt gedaan 
      System.out.println("Your end date cannot be earlier than your start date"); 
     } 
     else 
     { 
      // Try & Catch omdat er een error ParseException komt, Date is een long in plaats van een String 
      try 
      { 
       String start = startDate; 
       String end = endDate; 

       Date day1 = format.parse(start); 
       Date day2 = format.parse(end); 

       long difference = day2.getTime() - day1.getTime(); 
       /* 
       Verschil in de dagen die hierboven wordt uitgerekend, wordt hier omgezet naar de aantal 
       dagen. 24 = uren, 60 = minuten, 60 = seconden, 1000 = milliseconden 
       */ 
       long differenceInDays = difference/(24 * 60 * 60 * 1000) + 1; 
       // Hier cast ik het naar een int, omdat het een public int methode is 
       int castToInt = (int) differenceInDays;  
       return castToInt; 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     return 0; 
    } 

    public int getIncome() 
    { 
     int rent = 40; 
     // (Huur container * de ingevoerde volume) + (Huur container * verschil in de dagen) 
     int income = (rent * volume) + (rent * differenceInDays()); 
     return income; 
    } 

    public int getVolume() 
    { 
     return volume; 
    } 
} 

Я также попытался это, но он не работает либо. Я получаю значение 72, а не правильный номер.

public void getLongestRentPeriod() 
{ 
    int temp = 0; 
    for(Container container : containerList) 
    { 
     if(temp < container.differenceInDays()) 
     { 
      temp = container.differenceInDays(); 
     } 
     //System.out.println("max : " + Collections.max(container.differenceInDays())); 
    } 
    System.out.println("max: " + temp);   
} 

Может ли кто-нибудь дать мне несколько советов или предложений по решению? Благодарю.

ответ

2

сообщение об ошибке говорит, что это все:

no suitable method found for max(int)

Итак, вы хотите использовать метод макс, принимая Коллекцию в качестве аргумента, но то, что вы передаете методу не является сбор, что это INT:

Collections.max(container.differenceInDays()) 

с differenceInDays() определяется как

public int differenceInDays() 

Я предполагаю, что белый вам нужно найти Container, внутри набора containerList, что имеет наибольшую разницуInDays.Таким образом, вам нужно позвонить

Collections.max(containerList, comparatorComparingContainersByDifferenceInDays) 
+0

Это именно то, что я хочу найти, но ваше решение не работает для меня. В нем говорится: не удается найти переменную-переменную ComparatorComparingContainersByDifferenceInDays. Я не совсем понимаю эту строку кода. – SC92

+0

Вы должны написать компаратор , который берет два контейнера и сравнивает их по разности в днях. Посмотрите на javadoc. Google для «сравнения объектов в Java». Посмотрите на javadoc of Collections.max(). –

0

Вы используете

Collections.max(container.differenceInDays()) 

Где ваш метод Макс принимает коллекцию как parameter.see этой http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#max%28java.util.Collection%29

Так что, если вы сделаете свой Контейнер реализацию Сопоставимым и если вы пытаетесь

Container container = Collections.max(containerList);//without for loop 

Контейнер вмещает максимум всего контейнера. Или, если Container является третьей стороной, я бы предложил создать статический класс (или анонимный класс) с помощью метода сравнения, реализуя интерфейс Comparator. что-то вроде

private class ContainerComparator implements Comparator<Container> { 
    public int compare(Container o1, Container o2) { 
     //here calculate diff of each and send difference between the two 
    } 
} 
+0

Мне нужно получить максимум разницыInDays(), а не максимальный контейнерList. – SC92

1

В Java 8 вы можете сделать следующее:

OptionalInt max = containerList.stream().mapToInt(Container::differenceInDays).max(); 
Смежные вопросы