Collections.max 与列表中的自定义比较器

问题描述 投票:0回答:1

我有一个 Location 对象的数组列表,我想找到它的最大值和最小值。但是,当调用 collections.max(listN, PopulationComparator) 时,它给出最小值,而对于 collection.min() ,它返回最大值。一旦将顺序更改为降序,问题就解决了,但我不明白为什么这很重要。

static class PopulationComparator implements Comparator <Location>{
    public int compare(Location a, Location b){ 

      // ascending order
        if(a.getPop() > b.getPop()){ 
            return 1;
        }else if(a.getPop() < b.getPop()){
            return -1;
        }else{
            return 0;
        }
    }

}

public static void main(String[] args){
Location maxPopulation = Collections.max(listN, new PopulationComparator());
}
java collections interface
1个回答
0
投票

看起来您的代码是正确的,并且能够返回最小和最大填充区域。

我假设有一个名为

Location
的类,其属性名为
population
,该属性通过
getPop()
方法返回,如下所示。

static class Location {
    private int population;

    Location(int population) {
        this.population = population;
    }

    public int getPop() {
        return population;
    }
}

现在,如果我们创建一个包含一组

Location
的列表,那么
max
min
方法都可以正常工作。

public static void main(String[] args){
    Collection<Location> listN = new ArrayList<>();
    listN.add(new Location(300));
    listN.add(new Location(1));
    listN.add(new Location(20));
    listN.add(new Location(600000));
    listN.add(new Location(4000));
    listN.add(new Location(50000));

    Location maxArea = Collections.max(listN, new PopulationComparator());
    System.out.println("Max " + maxArea.getPop());

    Location minArea = Collections.min(listN, new PopulationComparator());
    System.out.println("Min " + minArea.getPop());
}

该程序的输出如下。

Max 600000
Min 1

您在哪里遇到问题?

© www.soinside.com 2019 - 2024. All rights reserved.