当前位置: 首页 > 知识库问答 >
问题:

如何使用比较器返回按人口排序的前五大城市列表?

鄢松
2023-03-14

我有一堂课《城市》

public final class City {
private final String name;
private final String state;
private final int    population;

public City(String name, String state, int population) {
    this.name       = name;
    this.state      = state;
    this.population = population;
}
public String getName() {
    return name;
}
public String getState() {
    return state;
}
public int getPopulation() {
    return population;
}
@Override
public String toString() {
    return "City [name=" + name + ", state=" + state + ", population=" + population + "]";
}
}

以及一个实现Observable(这不需要)的类。这个可观察类包含一个数组列表“list cityList”,其中包含所有已报告城市的数据。

我的新课程“TopFiveCities”应该:

msgstr"执行getter方法getTopMay()返回一个列表,其中包含接收到的前五个城市(就人口而言)。列表从高到低排序。返回的列表必须是观察者保存的列表的副本。"

除了获得前五名之外,我还需要知道如何从观察者那里复制这份名单

这就是我所拥有的:

public class TopFiveCities
implements Observer {

// THIS ALSO DOESN'T WORK UNLESS THE LIST IS STATIC
// SO HOW CAN I MAKE A COPY OF THE LIST FROM OBSERVER?
private List<City> list = new ArrayList<>(CensusOffice.cityList);

public List<City> getTopFive() {
    Collections.sort(list, new Comparator<City>() {

        @Override
        public int compare(City o1, City o2) {
            return Integer.compare(o1.getPopulation(), o2.getPopulation());
        }
        
    });
    return list;
}

public void update(Observable observable) {
    if (!(observable instanceof Observable)) {
        throw new IllegalArgumentException();
    }
}
}

这样,当其中一个样本输出应该是:“城市[name=Chicago,state=IL,population=2746388]”时,我只收到一个按人口从最低到最高排序的所有城市的列表。有什么帮助吗?

共有3个答案

李洋
2023-03-14

由于这是一项课业作业,我将描述这些部分,但让您将它们组装成最终代码。

我有一堂课《城市》

您可以更简单地将该类定义为记录。

City ( String name, String state, int population ) {}

持有一个数组列表"List cityList"

List < City > cities = new ArrayList<>();

获得前五名

使用反向比较器对列表进行排序。通过使用访问器“getter”方法的方法引用,可以创建一个用于排序的比较器。但是请注意,默认情况下,记录不使用“get”作为访问器,它们只使用属性的名称。

cities.sort( Comparator.comparing( City :: population ).reversed() ) ;

对于不可修改的列表,调用List.ofList.copyOf

List#subset为您提供一个包含原始文档中某些元素的列表。但是要注意:结果列表是基于原始列表的视图。子集不是独立的。要获得单独的列表,请转到list。复制或传递给另一个列表实现的构造函数。

List< City > topFivePop = List.copyOf( subset ) ;

提示:从技术上讲,您可以将getTopFive实现为一个“一行程序”,即一条语句。虽然我不建议在实际工作中用于生产,但这样做可能会对你的学习有所启发。

萧繁
2023-03-14

您可以使用流,使用比较器对流进行排序,限制元素的数量,并将元素转换为新列表:

List<City> top5citiesByPopulation = cities.stream()
        .sorted(Comparator.comparing(City::getPopulation).reversed())
        .limit(5)
        .collect(Collectors.toList());
楮乐邦
2023-03-14
int order = requestedOrder.equals("asc") ? 1 : -1;

Collections.sort(list, new Comparator<CustomObj>() {
    public int compare(CustomObj first, CustomObj scnd) {
        return first.getComparableParam().compareTo(scnd.getComparableParam()) * order;
    }
});

我只是从评论中推荐的stackover页面复制并传递了这个代码块。如果你想要升序,只需改变它。在你的代码中,顺序是-1。

只需乘以-1即可。

return Integer.compare(o1.getPopulation(), o2.getPopulation()) * -1;

在此之后,您可以将其转录。

您将列表保持为全局变量,它可以从更新方法中到达,但是如果类是单例,它不会改变,除了更新方法。您的更新方法可以通过通知

在更新方法中,您可以简单地通过list.add全部清除和添加新列表

 类似资料:
  • 我想学习java中的比较器,我在网上找到了这个很好的例子,我的问题是如何更改这个代码,使宠物的名字按年龄和降序排列,以便最大的是第一个,最小的是最后一个?

  • 我有一个程序可以对计算机的某个目录中的文件进行排序。我正在使用比较器接口和Collections.Sort-方法,但我无法访问调用类的输出。我也不知道如何在Sort-class中对对象进行排序。 1)如果有人能告诉我如何使用compare-method(prototyp是:sort(List List,Comparator c)我会很高兴

  • 我正试图根据员工的加入日期对他们的列表进行排序。下面是我的员工类。 下面是我的比较器类:

  • 问题内容: 是否有Java开源比较器可以按多个字段比较bean以进行多列排序?每列可以按升序或降序排序。 对于单列排序,可以与一起使用。 我知道编写此功能非常简单,但是如果已经编写并测试过轮子,那么重新发明轮子有什么好处? 问题答案: 我是几个月前写的。 只需从此类继承并重写doCompare-Method。然后使用设置链中的下一个比较器。比较器在此链中出现的越早,就越“重要”。 编辑: 另请参阅

  • 我的教授介绍了如何使用ArrayList创建Max Heap类。然后他让我们写一个maxHeapSort方法。我几乎成功地将堆按降序排序,但我假设排序应该按升序。现在我使用一个最大堆为[11,5,8,3,4,1]的ArrayList,它排序为[11,8,5,3,4,1]。 这是我的maxHeapSort代码: 下面是我的教授给出的heapifyDown方法: 这是我的测试代码:

  • 当跨城接送选择以上选项时,可允许跨城接送服务的城市列表如下: 1.西安-咸阳 2.深圳-东莞 3.廊坊-北京 4.佛山-广州 5.东莞-广州 6.苏州-上海 7.苏州-无锡 8.保定-石家庄 9.汕头-揭阳-潮州