java - 将对象与集合中的唯一标识符进行排序和关联
问题描述
我正在完成一项任务并卡在第 5 步,不胜感激。
- 仔细研究 Products.java 中的类结构。
- 设计一个名为 GenericOrder 的通用容器,它充当 Products.java 中任意数量对象的集合。设计一种机制,为容器的每个实例提供唯一标识符。根据需要实施尽可能多的方法。您必须使用 Java 泛型特性。
- 设计和实现一个名为 ComputerOrder 的 GenericOrder 子类,它采用任意数量的不同类的 ComputerPart 对象、Peripheral 对象和 Service 对象。根据需要实施尽可能多的方法。
- 设计并实现一个名为 PartyTrayOrder 的 GenericOrder 子类,它采用任意数量的不同类别的 Cheese 对象、Fruit 对象和 Service 对象。根据需要实施尽可能多的方法。
- 设计并实现一个名为 OrderProcessor 的类。您必须至少实现以下方法:
- 接受; // 此方法接受 GenericOrder 或其任何子类对象,并将其存储在 OrderProcessor 的任何内部集合中。
- 过程; // 此方法将 GenericOrder 内部集合中所有接受的订单分类为 ComputerPart、Peripheral、Cheese、Fruit 和 Service 的集合。您必须将每个对象与唯一标识符相关联。您可以参考教科书中的 TwoTuple.java 示例。
- 派遣XXX;// 此方法模拟已排序集合的分派。例如,方法 dispatchComputerParts() 应该产生这个输出:
- 主板名称=华硕,价格=$37.5,订单号=123456
- 主板 – 名称=华硕,价格=37.5 美元,订单号=987654
- RAM – 名称=金士顿,大小=512,价格=25.0 美元,订单号=123456
- 创建一个客户端类来测试 OrderProcessor。您将需要创建一个数据生成器用于测试目的。这不是强制性的,但您可以使用 TIJ 第 637 至 638 页中的数据生成器的变体。
这是我为 Q5 准备的
public abstract class OrderProcessor<T> {
private ArrayList<T> dataCollection = new ArrayList<T>();
public void accept(T item){
dataCollection.add(item);
}
public void process(){
Collections.sort(dataCollection);
}
public List getDataCollection(){
return dataCollection;
}
}
在其当前状态下Collections.sort(dataCollection);
无法编译,因为它不接受T
,并且如果我将 ArrayList 更改为String
其他子类使用的任何函数都将不起作用,因为它们都是T
. 任何帮助将不胜感激。
提前致谢。
解决方案
编辑:因为你想分区你的订单而不是排序,你可以使用这样的东西:
dataCollection.stream().collect(
Collectors.groupingBy(order -> order.getIdentifier())
)
在这里,这将它们按标识符分组并将它们放入Map
. 该order.getIdentifier()
部分只是您想要用来划分它们的任何内容的占位符。返回类型将为Map<TypeOfIdentifier, T>
.
但是,要使其正常工作,您T
必须是某种特定类型(T extends Product
也许?),以便您可以获得标识符。由于我不知道区分不同产品的代码,所以我不能在这里放确切的代码。
Javadoc 用于Collectors
这就是 Collections.sort 不适合您的原因,但无论如何您都不需要 Collections.sort。
T 必须扩展Comparable接口,因为显然您不能对任何类型的对象进行排序。Comparable 接口有一个compareTo
方法可以让你排序。
另一种方法是编写一个定义Comparator
单个方法的自定义:compare
,它将采用 2 个类型的对象T
并返回一个int
表示顺序的对象(在大多数情况下,它基本上是第一个参数减去第二个参数)。为此,您需要使用Collections.sort(dataCollection, customComparator)
.
您可以使用 lambda 表达式定义比较器,但除此之外我无能为力,因为我不知道您想如何对对象进行排序。
推荐阅读
- javascript - 为什么我的 JS 函数没有以 HTML 格式打印(显示在 console.log 中)
- jupyter-notebook - 如何在 jupyter notebook 中读取 csv 文件?
- elasticsearch - 使用多个“术语”和一个列表的 ElasticSDL 查询
- xml - 如何在选择网格时从行中访问数据,以便在 Adobe Flex(ActionScript)下面的文本字段中进一步使用它?
- python - ValueError:无法配置处理程序“file_store”
- javascript - 如果在布局刀片中使用两个模态,如何显示特定模态,假设表单已验证并且何时返回错误
- optaplanner - 产生班次
- recursion - Prolog 上的递归
- c# - 如何禁用 chrome 新版本没有相同的站点标志
- slack - Slack 应用程序在添加传入的 webbook 时出错