首页 > 解决方案 > 将对象与集合中的唯一标识符进行排序和关联

问题描述

我正在完成一项任务并卡在第 5 步,不胜感激。

  1. 仔细研究 Products.java 中的类结构。
  2. 设计一个名为 GenericOrder 的通用容器,它充当 Products.java 中任意数量对象的集合。设计一种机制,为容器的每个实例提供唯一标识符。根据需要实施尽可能多的方法。您必须使用 Java 泛型特性。
  3. 设计和实现一个名为 ComputerOrder 的 GenericOrder 子类,它采用任意数量的不同类的 ComputerPart 对象、Peripheral 对象和 Service 对象。根据需要实施尽可能多的方法。
  4. 设计并实现一个名为 PartyTrayOrder 的 GenericOrder 子类,它采用任意数量的不同类别的 Cheese 对象、Fruit 对象和 Service 对象。根据需要实施尽可能多的方法。
  5. 设计并实现一个名为 OrderProcessor 的类。您必须至少实现以下方法:
    • 接受; // 此方法接受 GenericOrder 或其任何子类对象,并将其存储在 OrderProcessor 的任何内部集合中。
    • 过程; // 此方法将 GenericOrder 内部集合中所有接受的订单分类为 ComputerPart、Peripheral、Cheese、Fruit 和 Service 的集合。您必须将每个对象与唯一标识符相关联。您可以参考教科书中的 TwoTuple.java 示例。
    • 派遣XXX;// 此方法模拟已排序集合的分派。例如,方法 dispatchComputerParts() 应该产生这个输出:
      • 主板名称=华硕,价格=$37.5,订单号=123456
      • 主板 – 名称=华硕,价格=37.5 美元,订单号=987654
      • RAM – 名称=金士顿,大小=512,价格=25.0 美元,订单号=123456
  6. 创建一个客户端类来测试 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. 任何帮助将不胜感激。

提前致谢。

标签: javagenerics

解决方案


编辑:因为你想分区你的订单而不是排序,你可以使用这样的东西:

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 表达式定义比较器,但除此之外我无能为力,因为我不知道您想如何对对象进行排序。


推荐阅读