我应该使用什么数据结构来存储不同类型的对象

时间:2011-11-30 18:17:21

标签: java data-structures

我想为书店建立一个简单的应用程序。有几种类型的东西可供出售:书籍,电影和杂志。我正在考虑使用toString()方法构建一个抽象类,以及3个子类 - 书籍,电影,杂志(之后会有更多)。然后在程序中我想对这些对象进行操作,并且我想我会将它们保存在ArrayList<ParentClass>中。这是数据结构的一个很好的选择吗?

5 个答案:

答案 0 :(得分:1)

首先,我建议你使用泛型。例如,如果您要定义抽象类(或可能更好的接口Item),那么创建new ArrayList<Item>,这样您就无法添加除Item之外的任何内容。

其次,使用界面。您的定义应如下所示:

List<? extends Item> lll = new ArrayList<Item>();

主要数据结构的选择取决于您的需求。我相信你会执行某种搜索机制。在这种情况下,您可以使用Map或组合顺序存储所有对象的列表和几个帮助您按不同参数执行搜索的映射。

无论如何,您应该通过提供业务逻辑基本功能的某个类(模型)来包装您的数据结构,因此如果您想要更改某些内容,您可以在此类中执行此操作,而无需对应用程序的其他部分进行任何更改。

答案 1 :(得分:0)

数据结构完全取决于您需要对数据执行的操作。如果您要做的就是遍历调用toString方法的所有对象,那么就去做吧。如果您需要对ArrayList缺陷的数据执行某些操作,那么最好开始查看其他选项。

答案 2 :(得分:0)

您可以创建类似BookstoreEntity抽象超类(或界面)的内容,其中包含您要操作的项目的共同特征。与colormaterialprice等相同...... 您可以在抽象超类中定义setter和getters方法。 BookstoreEntity个对象的列表将包含IS-A BookstoreEntity的任何内容。

您可以在for循环中操作常用方法(在超类中定义)(例如getColorgetPrice等...)

for(BookstoreEntity be: listOfItems) {

  be.getColor();
  be.getPrice();
  //etc...

}

问候!

答案 3 :(得分:0)

显然,您的问题不是元素的访问方法。因此任何容器类型(列表,地图,矢量等)都可能适合您的访问需求。 我想,更明确和全面的问题陈述是,如果对象的一般处理是在面向对象范式的背景下发布的。

但是,任何类的对象都可以放在任何通用容器中而不需要任何抽象(通过继承,接口或抽象类),因为所有类都默认扩展了Object类。如果不需要任何一般处理,例如对每个元素进行相同的操作,正如问题标题所暗示的那样,也可以使用它:ArrayList<Object> bookStore

但是,大多数人发现这种方法毫无用处,因为将这些对象放在一起以同样的方式使用时没有任何意义。我想,你应该努力确定这些对象的一般处理方法,然后声明一些属性。之后创建一个父类并用它定义容器。

答案 4 :(得分:0)

如果您想采用抽象类方式,我建议您设置常用属性。例如,当您使用书店的示例时,我确信一切都有价格。可能还有其他与之相关的事情。这将使您免于在子类中重复实现简单的事情。

abstract class BookstoreEntity {
    protected double price;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

我是Interfaces的忠实粉丝,而不是继承抽象类。我建议定义一个BookstoreEntity接口,而不是使用抽象类。

interface BookstoreEntity {

    public double getPrice();

    public void setPrice(double price);

    //more methods here.
}

我还建议您制作课程BookStoreProductManager 或类似的内容,以定义您的计划作为一个整体执行的操作。它可能包含一个很好地表示它的本机数据结构(可能是Map<int, BookStoreEntity>,其中int是产品ID)。 在这种情况下,我建议您不要继承数据结构