2016-08-28 133 views
0

我有一个CSV文件,我以Java的ArrayList存储。下面是我跑在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()); 
     } 
} 

}

代码正常不过,我有这个项目的下一部分故障代码。 数据实施例

  1. 日期打开高低关闭卷形关闭
  2. 6/10/2011 128.85 128.93 127.26 127.6 126.97 238629400
  3. 2011年6月13日127.89 128.24 127.05 127.7 127.07 207599800
  4. 6 /二千零十一分之十四128.87 129.77 128.82 129.32 160570400 128.68
  5. 2011/6/15 128.24 129.3 126.68 127.02 300958000 126.39
  6. 2011/6/16 127.06 127.97 126.32 127.3 308032800 126.67

我试图打印出日期范围的AdjClose价格。例如2011年6月13日至2016年6月15日之间。看起来我需要首先找到日期的索引,然后打印价格记录。

我该怎么做?我不知道从哪里开始。我是否首先需要将日期保存在自己的列表/数组中并使用它来查找索引?

感谢

+1

您将日期存储为字符串,这将使得它们难以比较。您可以将它们存储为java.time.LocalDate。 –

回答

0

您需要通过StockRecord列表迭代每条记录的日期比较,以你指定的范围。如果它落在你打印的范围内。如果您的列表已分类,这可以进行优化。

0

要比较的第一次约会最好使用一个数据类型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.time.LocalDate'混合起来,这两个完全不同且不相关的类,第一个来自Java 1,另一个来自Java 8. java.util.Date类提供'之后','之前','等于'和'比较之后'进行比较。您列出了其他课程的方法。但是真的应该完全避免这个'java.util.Date'类,并且它的兄弟类java.util.Calendar'也是完全可以避免的。设计不好,令人困惑和麻烦。现在由java.time类取代。 –

0

记录和类型StockRecord的对象比较你的日期字段你的问题是真的堆栈溢出中的许多其他副本。

LocalDate

你的示例代码实际上并没有显示日期为您StockRecord类的一部分。但它应该是LocalDate类型的成员。搜索堆栈溢出了解如何将输入字符串解析为LocalDate的无数帖子。

Comparator

定义你的类Comparator,提取LocalDate的比较。 LocalDate类本身实现了compareTo方法,以及isBefore,isAfterisEqual。排序

如果你要经常做这个查询

效益,话很有道理的StockRecord对象为List排序。那么你可以聪明地搜索,在Stack Overflow的许多其他帖子中再次讨论。

SortedMap

你可以组织StockRecord对象为SortedMap,映射LocalDateCollectionStockRecord对象分享特定的日期。如上所述,使用SortedMap而不仅仅是Map可以让您更智能地搜索日期范围。再次,Stack Overflow上的许多贴子都是关于贴图的。

阿帕奇百科全书CSV

顺便说一句,Apache Commons CSV项目使得阅读轻松的工作,并解析CSV数据文件。

BigDecimal

使用doubleDouble的货币金额,或任何分数,其中精度非常重要的。这些类型是floating-point类型,为速度而构建,但交易走的准确性。您将在小数部分的末尾引入额外的数字。

改为使用BigDecimal。再次,在这个类上堆栈溢出的许多帖子。

整数

不要使用小数像Double为整数,如您Volume场。这样做会浪费内存,并且会给读取代码的人造成混淆。

使用一个32位的integerInteger如果您的最大值是二十亿或更少(2^31-1 = 2,147,483,647),否则在64位longLong