2016-11-07 5 views
1

В настоящее время я пишу программу java, чтобы узнать, в какой день был создан молоток или другой образец подсвечника. Пользователь должен ввести 2 даты в качестве аргументов при выполнении программы, например. java ReadingTest 2016-09-03 2016-10-31, и программа будет искать шаблон молотка с 2016-09-03 по 2016-10-31. код выглядит следующим образом:Дата составления в if-заявлении и показ только результатов в оговоренном интервале времени

import java.io.*; 
import java.util.*; 
import java.text.*; 

public class ReadingTest 
{ 
    public static void main(String[] args) throws IOException,ParseException 
    { 
    //Import file to java 
    File file = new file("table.csv"); 

    //Read the file 
    Scanner infile = new Scanner(file); 

    //Skip the first line in table.csv 
    infile.nextLine(); 

    //Define format of date 
    SImpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

    //Name the variables user enters 
    Date start = sdf.parse(args[0]); 
    Date end = sdf.parse(args[1]); 

    //Create ArrayList for each column of data 
    ArrayList<String> date = new ArrayList<String>(); 
    ArrayList<Double> open = new ArrayList<Double>(); 
    ArrayList<Double> high = new ArrayList<Double>(); 
    ArrayList<Double> low = new ArrayList<Double>(); 
    ArrayList<Double> close = new ArrayList<Double>(); 

    while (infile.hasNext()) 
    { 
     //Tokenize columns by comma 
     String[] data = infile.nextLine().split(","); 
     //Organize each column of data to one index of data array 
     date.add(data[0]); 
     open.add(Double.parseDouble(data[1])); 
     high.add(Double.parseDouble(data[2])); 
     low.add(Double.parseDouble(data[3])); 
     close.add(Double.parseDouble(data[4])); 
    } 
    //Show options and ask user to choose 
    System.out.println("1. Hammer"); 
    System.out.println("2. Three white soldiers"); 
    System.out.println("3. Bullish kicker"); 

    //Record user input and execute corresponding code 
    Scanner input = new Scanner(System.in); 
    int choice = input.nextInt(); 

    if (choice == 1) 
     for (int i = 0; i < date.size(); i++) 
      if (close.get(i) > open.get(i) && 
       close.get(i) > ((high.get(i)) + (low.get(i)))/2 && 
       ((close.get(i) - low.get(i))/2 > (high.get(i) - close.get(i))) 
      System.out.println("Pattern found: " + date.get(i)); 
} 
} 

Код отлично работает до здесь. Однако вывод в последней строке кода находится в формате dd/MM/yyyy, и я попытался использовать sdf.parse (date.get (i)) вместо date.get (i), чтобы показать результаты в yyyy-MM -dd. Выполнение кода с sdf.parse (date.get (I)) возвращает следующее сообщение об ошибке:

Exception in thread "main" java.text.ParseException: Unparseable date: 
"25/10/2016" at 
java.text.DateFormat.parse(Unknown source) at ReadingTest.main(ReadingTest.java:59) 

Я также попытался показать только даты показал образец молотка, используя

(date.get(i).after(start) && date.get(i).before(end)) 

и результаты в

error: cannot find symbol 
symbol: method before(Date) 
location: class String 

И файл CSV выглядит следующим образом:

Date  Open High Low Close 
31/10/2016 58.25 58.65 58.2 58.35 
28/10/2016 58.95 59 58.3 58.35 
. 
. 
. 
1/8/2016 50.8 51.1 50.75 50.8 

Как изменить код, чтобы заставить его работать?

+2

Ваш код не компилируется из-за некоторой базовой опечатки (т. Е. Отсутствующей скобки в начале основной функции). Попробуйте в следующий раз дать правильный пример кода. – BaptisteL

+1

Кстати, вы используете старые классы времени, теперь устаревшие, вытесненные классами java.time. –

ответ

2

Я предполагаю, что вы хотите это

SimpleDateFormat hammerFormat = new SimpleDateFormat("yyyy-MM-dd"); 
SimpleDateFormat slashFormat = new SimpleDateFormat("dd/MM/yyyy"); 

так что вы можете разобрать дату на yyyy-MM-dd представления, как этот

hammerFormat.format(slashFormat.parse(date.get(i)))); 

Полный код

import java.io.File; 
import java.io.IOException; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.Scanner; 

public class ReadingTest { 
    public static void main(String[] args) throws IOException, ParseException { 
     // Import file to java 
     File file = new File("table.csv"); 

     // Read the file 
     Scanner infile = new Scanner(file); 

     // Skip the first line in table.csv 
     infile.nextLine(); 

     // Define format of date 
     SimpleDateFormat hammerFormat = new SimpleDateFormat("yyyy-MM-dd"); 
     SimpleDateFormat slashFormat = new SimpleDateFormat("dd/MM/yyyy"); 

     // Name the variables user enters 
     Date start = hammerFormat.parse(args[0]); 
     Date end = hammerFormat.parse(args[1]); 

     // Create ArrayList for each column of data 
     ArrayList <String> date = new ArrayList <String>(); 
     ArrayList <Double> open = new ArrayList <Double>(); 
     ArrayList <Double> high = new ArrayList <Double>(); 
     ArrayList <Double> low = new ArrayList <Double>(); 
     ArrayList <Double> close = new ArrayList <Double>(); 

     while (infile.hasNext()) { 
      // Tokenize columns by comma 
      String[] data = infile.nextLine().split(","); 
      // Organize each column of data to one index of data array 
      date.add(data[0]); 
      open.add(Double.parseDouble(data[1])); 
      high.add(Double.parseDouble(data[2])); 
      low.add(Double.parseDouble(data[3])); 
      close.add(Double.parseDouble(data[4])); 
     } 
     // Show options and ask user to choose 
     System.out.println("1. Hammer"); 
     System.out.println("2. Three white soldiers"); 
     System.out.println("3. Bullish kicker"); 

     // Record user input and execute corresponding code 
     Scanner input = new Scanner(System.in); 
     int choice = input.nextInt(); 

     if (choice == 1) 
      for (int i = 0; i < date.size(); i++) 
       if (close.get(i) > open.get(i) && close.get(i) > ((high.get(i)) + (low.get(i)))/2 && ((close.get(i) - low.get(i))/2 > (high.get(i) - close.get(i)))) 
        System.out.println("Pattern found: " + hammerFormat.format(slashFormat.parse(date.get(i)))); 
    } 
} 

Edit:

В формате .csv файла, как это (потому что в коде он говорит .split(","))

31/10/2016, 58.25, 58.65, 58.20, 58.35 
28/10/2016, 58.95, 59.00, 58.30, 58.35 
01/08/2016, 50.80, 51.10, 50.75, 50.80 

Он отлично работает для меня. Я передал два аргумента 2016-09-03 2016-10-31 при выполнении программы.

+1

есть ошибка, говорящая об исключении в потоке «main» java.lang.ArrayIndexOutOfBoundException: 0 в ReadingTest.main добавлен даже ArrayOutOfBounds Exceptiono –

+1

@Z_Z, вам нужно передать два аргумента при выполнении программы. Также см. Редактирование в моем ответе – ncw

2

Формат в файле НЕ имеет формат «yyyy-MM-dd», он имеет формат «dd/MM/yyyy», поэтому вы не можете разобрать его с помощью переменной sdf. Вы можете определить второй формат даты

SImpleDateFormat sdfParse = new SimpleDateFormat("dd/MM/yyyy"); 

, а затем сделать разбор с этим и форматирование с вашими:

sdf.format(sdfParse.parse(date.get(i))) 

, мы надеемся получить лучший результат.

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

  • Нет связанных вопросов^_^