在HashSet中使用Collection.max()查找最高值

时间:2014-11-02 15:25:17

标签: java bluej

这是用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);        
}

有人可以给我一些解决方案的提示或建议吗?感谢。

3 个答案:

答案 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
    }
}