这是用BlueJ编码的!
大家好,我正在尝试在HashSet中找到最大值。我正在尝试使用Collection.max方法,但它对我不起作用。我收到一个错误:没有为max(int)找到合适的方法。错误发生在我的VerhuurderBedrijf类中,最后一个方法叫做getLongestRentPeriod。
我有2个班,(荷兰语)VerhuurderBedrijf和Container。 在Container类中,我有一个名为differenceInDays的方法。这里计算startDate和endDate之间的天数差异(请参阅Container类中的字段)。
在VerhuurderBedrijf中,我在HashSet中添加了Container对象。在我的getLongestRentPeriod中,我试图找到我在differenceInDays方法(Container类)中计算的最高值。
假设我在我的VerhuurderBedrijf类中添加了2个容器对象
容器1 - startDate = 10-10-2014; endDate = 15-10-2014;
容器2 - startDate = 10-10-2014; endDate = 20-10-2014;
正如我所说,天数的差异是通过我的differenceInDatys方法(容器类)/
所以使用我的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);
}
有人可以给我一些解决方案的提示或建议吗?感谢。
答案 0 :(得分:2)
错误消息说明了一切:
没有为max(int)
找到合适的方法
所以,你想使用一个方法max,以Collection作为参数,但是你传递给方法的不是Collection,它是一个int:
Collections.max(container.differenceInDays())
将differenceInDays()
定义为
public int differenceInDays()
我认为你想要的是在集合Container
内找到差异最大的containerList
。所以你需要打电话
Collections.max(containerList, comparatorComparingContainersByDifferenceInDays)
答案 1 :(得分:1)
在Java 8中,您可以执行以下操作:
OptionalInt max = containerList.stream().mapToInt(Container::differenceInDays).max();
答案 2 :(得分:0)
您正在使用
Collections.max(container.differenceInDays())
您的max方法将collection作为参数。请参阅此http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#max%28java.util.Collection%29
因此,如果您将Container实现为Comparable并且尝试
Container container = Collections.max(containerList);//without for loop
容器将保留所有容器的最大值。或者如果Container是第三方,我建议您通过实现Comparator接口使用compare方法创建静态类(或匿名类)。
之类的东西private class ContainerComparator implements Comparator<Container> {
public int compare(Container o1, Container o2) {
//here calculate diff of each and send difference between the two
}
}