我有一堂课《城市》
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]”
时,我只收到一个按人口从最低到最高排序的所有城市的列表。有什么帮助吗?
由于这是一项课业作业,我将描述这些部分,但让您将它们组装成最终代码。
我有一堂课《城市》
您可以更简单地将该类定义为记录。
City ( String name, String state, int population ) {}
持有一个数组列表"List cityList"
List < City > cities = new ArrayList<>();
获得前五名
使用反向比较器对列表进行排序。通过使用访问器“getter”方法的方法引用,可以创建一个用于排序的比较器。但是请注意,默认情况下,记录不使用“get”作为访问器,它们只使用属性的名称。
cities.sort( Comparator.comparing( City :: population ).reversed() ) ;
对于不可修改的列表,调用List.of
或List.copyOf
。
List#subset
为您提供一个包含原始文档中某些元素的列表。但是要注意:结果列表是基于原始列表的视图。子集不是独立的。要获得单独的列表,请转到list。复制
或传递给另一个列表
实现的构造函数。
List< City > topFivePop = List.copyOf( subset ) ;
提示:从技术上讲,您可以将getTopFive
实现为一个“一行程序”,即一条语句。虽然我不建议在实际工作中用于生产,但这样做可能会对你的学习有所启发。
您可以使用流,使用比较器对流进行排序,限制元素的数量,并将元素转换为新列表:
List<City> top5citiesByPopulation = cities.stream()
.sorted(Comparator.comparing(City::getPopulation).reversed())
.limit(5)
.collect(Collectors.toList());
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.汕头-揭阳-潮州