2016-08-28 18 views
0

私はJavaでarraylistとして保存したCSVファイルを持っています。ここで私はArrayListでのインデックスの検索

public class StockData { 
private ArrayList<StockRecord> records; 

public StockData() { 
    records = new ArrayList<StockRecord>(); 
} 

//reads the file from the folder 
public void loadPriceData(String filepath) { 
    try { 
     Scanner scanner = new Scanner(new FileReader(filepath)); 
     String line; 
     StockRecord record; 
     scanner.nextLine(); 
     while (scanner.hasNextLine()) { 
      line = scanner.nextLine(); 
      String[] results= line.split(","); 
      double open = Double.parseDouble(results[1]); 
      double high = Double.parseDouble(results[2]); 
      double low = Double.parseDouble(results[3]); 
      double close = Double.parseDouble(results[4]); 
      double volume = Double.parseDouble(results[5]); 
      double adjClose = Double.parseDouble(results[6]); 
      //create the record 
      record = new StockRecord(results[0], open, high, low, close, volume, adjClose); 
      records.add(record); 
     } 
     scanner.close(); 
     } catch (Exception e) { 
      System.out.println("Error: " + e.getMessage()); 
     } 
} 

}

を実行したコードだコードがしかし正しく動作しますが、私は、プロジェクトの次の部分に問題が生じています。閉じる

  • 2011年6月10日128.85 128.93 127.26 127.6 238629400 126.97
  • 2011年6月13日127.89 128.24 127.05 127.7 207599800 127.07
  • 6/ADJ データ例

    1. 日オープン高い低いを閉じるボリューム2011分の14 128.87 129.77 128.82 129.32 128.68 160570400
    2. 2011年6月15日128.24 129.3 126.68 127.02 126.39 300958000
    3. 2011年6月16日127.06 127.97 126.32 127.3 308032800 126.67

    日付範囲のAdjClose価格を印刷しようとしています。 2011年6月13日から2011年6月16日まで私は最初に日付のインデックスを見つけて価格記録を印刷する必要があるようです。

    どうすればいいですか?どこから始めたらいいか分からない。まず、独自のリスト/配列に日付を保存し、それを使ってインデックスを見つける必要がありますか?

    おかげ

  • +1

    日付を文字列として保存すると、比較が難しくなります。代わりに、それらをjava.time.LocalDateとして格納することもできます。 –

    答えて

    0

    あなたはStockRecordのリストを反復して、指定された範囲に、各レコードの日付を比較する必要があります。範囲内であれば、それを印刷します。これは、リストがソートされている場合に最適化できます。最初の日付を比較すること

    0

    があなたの日付フィールドを比較し、あなたの配列はタイプStockRecordのレコードとオブジェクトを精練することができればdate

    にデータ型を使用することが好ましいあなたは

    for (StockRecord reg : records) { 
         if(reg.date.after(historyDate) && reg.date.before(futureDate)) { 
          System.out.println(reg.toString()); // print object 
         } 
        } 
    
    +0

    誤った情報です。古いレガシークラスjava.util.Dateについて言及しましたが、まったく異なるクラスjava.time.LocalDateのメソッドをリストします。 –

    +0

    日付の前後の比較方法については、どこが間違っていますか? –

    +0

    'java.util.Date'はjava.util.Dateと' java.time.LocalDate'を全く別の2つの無関係なクラスとして、Java 1からの最初のものとJava 8からのものとを組み合わせています。 'java.util.Date'クラスは'比較のために「after」、「before」、「equals」、および「compareTo」を含む。あなたは他のクラスのメソッドをリストしました。しかし、実際には、この 'java.util.Date'クラスは完全に避けなければなりません。また、兄弟クラス' java.util.Calendar'も避けるべきです。設計が貧弱で、混乱し、面倒です。 java.timeクラスに置き換えられました。 –

    0

    あなたの質問は本当に評価したいですスタックオーバーフローで他の多くの複製。

    LocalDate

    あなたのコード例では、実際にあなたのStockRecordクラスの一部として日付を表示しません。ただし、タイプはLocalDateである必要があります。あなたの入力文字列をどのように解析してLocalDateにするかについての無数の記事のためのスタックオーバーフローの検索。

    Comparator

    比較にLocalDateを抽出するために、あなたのクラスのComparatorを定義します。 LocalDateクラスはcompareToメソッドとisBefore,isAfterおよびisEqualを実装しています。あなたは、多くの場合、このクエリを実行する場合

    をソートする

    利点は、それがListStockRecordオブジェクトを並べ替えることは理にかなっています。その後、スタックオーバーフローの他の多くの記事で再び議論して、検索について賢明にすることができます。

    SortedMap

    あなたは、その特定の日付を共有StockRecordオブジェクトのCollectionLocalDateをマッピングし、SortedMapStockRecordオブジェクトを整理できます。 MapではなくSortedMapを使用すると、上記のように、日付範囲をよりスマートに検索できます。繰り返しになりますが、スタックオーバーフローに関する多くの記事がマップについて掲載されています。

    のApache CommonsのCSV

    ところで、Apache Commons CSVプロジェクトは、CSVデータファイルを読み込んで解析する作業を簡単にするものです。

    BigDecimal

    通貨金額のため、または任意の分数で精度の事項についてない使用doubleまたはDoubleを行います。これらのタイプはfloating-pointタイプです。小数点の末尾に余分な数字を追加します。

    代わりにBigDecimalを使用してください。さらに、このクラスのStack Overflowに関する多くの記事があります。

    整数

    は、そのようなあなたのVolumeフィールドとして整数用Doubleのような小数を使用しないでください。そうすることでメモリが浪費され、コードを読んでいる人に混乱が生じます。

    使用する32ビットinteger又はIntegerあなたの最大値である場合は20億以下(2^31-1 = 2,147,483,647)、そうでない場合は64ビットlong又はLong

    関連する問題