2017-11-18 141 views
0

我写一个程序,其中,我将读取多个文件数据转换为ArrayList<E>基于容器和输出经处理的数据到一个应用于LineChart由数据被记录的日期(X绘图数据(y轴)的数值-轴)。什么是有效的数据结构来包含多个复杂的类对象并通过一个公共参数来组织它们?

一个I构建了三个关键类是基础类DataPoint它执行批量数据处理和验证的为DataPoint类对象。

另一个是DataArrayList<T extends DataPoint>从其超ArrayList<E>延长。 DataArrayList是排序,概括的接口(我想我正确地使用这个词),并含有DataPoint类对象。

最后键类,我已经挣扎的一个,是HomeDataPoint其中将包含一个编号DataPoint类对象为一个时间点,所以每个DataPoint必须彼此的同一指定的时间周期内。我已经与指定的时间段是一天一个默认测试这个(每包含DataPoint必须在同一天被读取),但最终我觉得我目前的数据结构是为我创建不足,销毁,重新定义,并重新创造了无数次。也就是说,我尝试将包含的DataPoint对象存储在ArrayLists,LinkedHashSets中,并作为单个的DataPoint对象进行存储。在与泛型的交互,数据的封装以及输入的并行处理之间,我都迷失了方向。

下面是HomeDataPointinsert()方法的代码,其中包含可能的进入DataPoint类对象的类型的枚举,并且它的声明的成员变量:

private enum DataType 
      { 
       WEATHER_CLASS(WeatherDataPoint.class), 
ELECTRIC_CLASS(ElectricDataPoint.class), GAS_CLASS(GasDataPoint.class); 

      private final Class<? extends DataPoint> type; 

      DataType(Class<? extends DataPoint> type) 
      { 
       this.type = type; 
      } 

      public Class<? extends DataPoint> getType() 
      { 
       return type; 
      } 
     } 

     private DataArrayList<WeatherDataPoint> weatherLowPoints = null; 
     private DataArrayList<WeatherDataPoint> weatherHighPoints = null; 
     private DataArrayList<ElectricDataPoint> electricPoints = null; 
     private DataArrayList<GasDataPoint> gasPoints = null; 

而且insert()方法:

public boolean insert(DataPoint dataElement) 
     { 
      if (totalSize() > 0 && !getDate().substring(0, 10).equals(dataElement.getDate().substring(0, 10))) 
      { 
       return false; 
      } 
      else if (totalSize() == 0) 
      { 
       setDate(dataElement.getDate()); 
      } 

      for (DataType type : DataType.values()) 
      { 
       if (type.getType().equals(dataElement.getClass())) 
       { 
        switch (type) 
        { 
         case WEATHER_CLASS: 
          weatherLowPoints.add((WeatherDataPoint) dataElement); 
          weatherHighPoints.add((WeatherDataPoint) dataElement); 
          return true; 
         case ELECTRIC_CLASS: 
          electricPoints.add((ElectricDataPoint) dataElement); 
          return true; 
         case GAS_CLASS: 
          gasPoints.add((GasDataPoint) dataElement); 
          return true; 
         default: 
          return false; 
        } 
       } 
      } 
      return false; 
     } 
+0

我有点担心自己会变得一般。我不知道我想问什么,但我知道我想要做什么。我认为需要最大改进的部分是'insert()'方法。如,如果一个''类的WeatherDataPoint'对象DataPoint',例如,被传递到插入'()'方法,该点会被添加到两个'weatherLowPoints'和'weatherHighPoints'。我宁愿控制添加哪一个(具有高温点或低温点的那个),但是我目前的结构不容易这样做,特别是因为我希望它能够普遍工作。 –

+0

你在那里漫无目的地漫步,然后从不回答问题。或换句话说,“嗯?”。说真的,我不知道你在做什么或者你希望我们帮你做什么。请编辑您的文本,并至少*提出问题*。 –

+0

对不起。在这一点上,我觉得我不能提出一个具体的问题,因为我已经得到了与每个DataPoint类的更大结构相关的代码问题。我试图删除我的帖子,因为它是无益的,但我不允许。 –

回答

0

您应该使用Visitor模式为您的数据点类,这样你就不必做类型转换。

而是对类型转换只是叫你只需要调用dataElement.accept(yourVisitor);

你也可以使用多态直接,如果你认为旋进你需要做的应该是数据点类的一部分: https://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html

+0

谢谢!我一直不愿意将'DataPoint'作为抽象类,因为我在'DataArrayList'类中实例化了它,但是我觉得这只是因为我没有努力去找到一个必须实例化它的解决方法。然而,'accept(DataPoint p)'方法的想法看起来很明智。 –

相关问题