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)'方法的想法看起來很明智。 –

相關問題