什么是包含多个复杂类对象并通过一个公共参数组织它们的有效数据结构?

时间:2017-11-18 05:50:58

标签: java sorting generics arraylist data-structures

我正在编写一个程序,在其中我将多个文件中的数据读入基于ArrayList<E>的容器中,并将处理后的数据输出到线图上,以图形化数据的数值(y轴)。记录数据(x轴)。

我构建的三个关键类之一是基类DataPoint,它对DataPoint类对象进行大量数据处理和验证。

另一个是DataArrayList<T extends DataPoint>从其超类ArrayList<E>扩展而来。 DataArrayList是一个接口(我认为我正确地使用了该单词),它对DataPoint类对象进行排序,汇总和包含。

最后一个关键类,也是我一直在努力的关键类,HomeDataPoint包含一个时间点的多个DataPoint类对象,因此每个DataPoint必须在彼此相同的指定时间段内。我一直在测试这个,指定的时间段是默认的一天(每个包含DataPoint必须在同一天读取),但最终我觉得我当前的数据结构不够,因为我已创建,摧毁,重新定义,并无数次重建它们。也就是说,我已经尝试将包含的DataPoint对象存储在ArrayLists,LinkedHashSets和单个DataPoint对象中。在与泛型的交互,数据的封装以及输入的并行处理之间,我已经相当丢失了。

以下是HomeDataPoint insert()方法的代码,一个包含可能的传入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;
        }

1 个答案:

答案 0 :(得分:0)

您应该为您的DataPoint类使用访问者模式,这样您就不必进行类型转换。

您只需拨打dataElement.accept(yourVisitor);

,而不是打开电话类型

如果您认为需要进行的处理应该是Data Point类的一部分,您也可以直接使用多态: https://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html