Это закодировано в 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);
}
Может ли кто-нибудь дать мне несколько советов или предложений по решению? Благодарю.
Это именно то, что я хочу найти, но ваше решение не работает для меня. В нем говорится: не удается найти переменную-переменную ComparatorComparingContainersByDifferenceInDays. Я не совсем понимаю эту строку кода. – SC92
Вы должны написать компаратор, который берет два контейнера и сравнивает их по разности в днях. Посмотрите на javadoc. Google для «сравнения объектов в Java». Посмотрите на javadoc of Collections.max(). –