2016-08-28 4 views
0

У меня есть файл CSV, который я хранил как arraylist в Java. Вот код, я побежалПоиск индекса в 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. Дата Открытия High Low Close Volume Adj Закрыть
  2. 6/10/2011 128.85 128.93 127,26 127,6 126,97 238629400
  3. 6/13/2011 127,89 128,24 127,05 127,7 127,07 207599800
  4. 6/14/2011 128,87 129,77 128,82 129,32 160570400 128,68
  5. 6/15/2011 128,24 129,3 126,68 127,02 300958000 126,39
  6. 6/16/2011 127,06 127,97 126,32 127,3 308032800 126,67

Я пытаюсь распечатать цену AdjClose для диапазона дат. скажем, между 13.06.2011 и 06/15/2016. Похоже, мне нужно будет сначала найти индекс даты, а затем распечатать запись о цене.

Как я могу это сделать? Я не знаю, с чего начать. Нужно ли сначала сохранять дату в своем собственном списке/массиве и использовать ее для поиска индекса?

Благодаря

+1

Вы храните даты в виде строк, что затруднит их сравнение. Вместо этого вы можете хранить их как java.time.LocalDate. –

ответ

0

Вам нужно будет перебирать список StockRecord и сравнить дату каждой записи на указанный диапазон. Если он попадает в диапазон, вы должны его распечатать. Это можно оптимизировать, если ваш список отсортирован.

0

Для сравнения первой даты предпочтительнее использовать тип данных date

Если массив может соскабливать записи и объекты типа StockRecord сравнивающие ваше поле даты вы хотите оценить

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

Неточная информация! Вы упомянули старый класс legacy java.util.Date, но затем перечислите методы для совершенно другого класса java.time.LocalDate. –

+0

Упоминайте методы сравнения дат после и до, где не так? –

+0

Вы объединяете 'java.util.Date' с' java.time.LocalDate', два совершенно разных и несвязанных класса, первый из Java 1, а другой из Java 8. Класс 'java.util.Date' предлагает' after', 'before',' equals' и 'compareTo' для сравнения. Вы указали методы для другого класса. Но на самом деле этот класс 'java.util.Date' должен быть полностью исключен, а также его класс sibling' java.util.Calendar'. Плохо спроектированный, запутанный и хлопотный. Теперь вытесняется классами java.time. –

0

Ваш вопрос действительно дубликат многих других в переполнении стека.

LocalDate

Ваш пример код на самом деле не показывает дату, как часть вашего StockRecord класса. Но он должен быть членом типа LocalDate. Search Stack Overflow для бесчисленных сообщений о том, как анализировать входную строку в LocalDate.

Comparator

Определение Comparator для вашего класса, чтобы извлечь LocalDate для сравнения. Сам класс LocalDate реализует метод compareTo, а также isBefore, isAfter и isEqual.

Преимущество сортировки

Если вы будете делать этот запрос часто, то имеет смысл сортировать StockRecord объекты в List.Тогда вы можете быть умны в поиске, снова обсуждались на многих других сообщениях в Stack Overflow.

SortedMap

Вы можете организовать StockRecord объектов в SortedMap, КАРТОГРАФИРОВАНИЕ LocalDate к Collection из StockRecord объектов обмена, что конкретная дата. Использование SortedMap, а не просто Map позволяет вам более разумно искать диапазон дат, как указано выше. Опять же, много сообщений о переполнении стека о картах.

Apache Commons CSV

Кстати, Apache Commons CSV проект облегчает работу чтения и разбора файла данных CSV.

BigDecimal

ли не использование double или Double для денежных сумм, или для любого дробного числа, где вопросы точности. Эти типы - это floating-point типы, построенные для скорости, но с гарантией точности. Вы будете вводить лишние дополнительные цифры в конце десятичной дроби.

Вместо этого использовать BigDecimal. Еще раз, много сообщений о переполнении стека в этом классе.

Целые

Не использовать дробное число, как Double для целого числа таких, как ваш Volume поле. Делая это, теряется память, и создается путаница для тех, кто читает ваш код.

Используйте 32-битный integer или Integer, если ваш максимальное значение составляет два миллиарда или меньше (2^31-1 = 2147483647), в противном случае это 64-битный long или Long.

Смежные вопросы