【问题标题】:Reading DATE type from text file从文本文件中读取日期类型
【发布时间】:2017-07-26 15:30:47
【问题描述】:

我有一个像这样的文本文件

2017-06-14  7932
2017-06-15  10092
2017-06-16  7626
2017-06-17  7613
2017-06-18  11072
2017-06-19  8286
2017-06-20  9293

我正在尝试将值存储在 ArrayList 中。

我的代码:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.*;
import java.util.Scanner;

public class Sample2 {

    public static void main(String[] args) throws FileNotFoundException {

        List<Date> l1 = new ArrayList<Date>();
        List<Integer> l2 = new ArrayList<Integer>();

        Scanner s = new Scanner(new FileReader("t1.txt"));

        while (s.hasNext()) {
         l1.add(s.nextInt());      !!!!-----Error Line-----!!!!!!!!
         l2.add(s.nextInt());
        }


        s.close();

        System.out.println(l1);
        System.out.println(l2);;
    }
}

我收到以下错误:

线程“main”java.lang.Error 中的异常:未解决的编译问题: List 类型中的方法 add(int, Date) 不是 适用于参数 (int) 在 Sample2.main(Sample2.java:17)

我该如何解决?

【问题讨论】:

标签: java date arraylist


【解决方案1】:

两个建议:

  1. 创建一个小类来保存日期和属于一起的int。为什么?请参阅 Jon Skeet 的 Anti-pattern: parallel collections
  2. 跳过过时的Date 类并改用现代的LocalDate。它模拟没有时间的日期,这正是您需要的。它还可以直接解析您的日期,无需明确的格式,因此对于您的特定目的非常方便。

下面我只是将代码集中在一个类中,您可能想要一个包含更多类的设计。我会把它留给你。

public class Sample2 {

    private LocalDate date;
    private int value2;

    public Sample2(LocalDate date, int value2) {
        this.date = date;
        this.value2 = value2;
    }

    @Override
    public String toString() {
        return "\nSample2 [date=" + date + ", value2=" + value2 + "]";
    }

    public static void main(String[] args) throws FileNotFoundException {

        List<Sample2> l = new ArrayList<>();

        Scanner s = new Scanner(new FileReader("t1.txt"));

        while (s.hasNext()) {
            l.add(new Sample2(LocalDate.parse(s.next()), s.nextInt()));
        }

        s.close();

        System.out.println(l);
    }
}

程序打印

[
Sample2 [date=2017-06-14, value2=7932], 
Sample2 [date=2017-06-15, value2=10092], 
Sample2 [date=2017-06-16, value2=7626], 
Sample2 [date=2017-06-17, value2=7613], 
Sample2 [date=2017-06-18, value2=11072], 
Sample2 [date=2017-06-19, value2=8286], 
Sample2 [date=2017-06-20, value2=9293]]

我还将让您添加 getter(您可能不需要 setter)并找到更好的变量名称。你知道这些数字是什么意思。

【讨论】:

    【解决方案2】:

    您需要使用nextInt() 方法检查int

    “else”s.next() 将返回 String

    这将解决您的错误:

    while (s.hasNext()) {
       if (s.hasNextInt()) {
           int myInt = s.nextInt();
           System.out.println(myInt);
       } else {
           String dateAsString = s.next();
           System.out.println(dateAsString);
       }
    }
    

    当我运行这段代码时,我得到:

    2017-06-14
    7932
    2017-06-15
    10092
    2017-06-16
    7626
    2017-06-17
    7613
    2017-06-18
    11072
    2017-06-19
    8286
    2017-06-20
    9293
    

    您必须将日期字符串转换为 localDate()Date()

    【讨论】:

      【解决方案3】:

      你可以试试下面的代码

      import java.io.FileNotFoundException;
      import java.io.FileReader;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.ArrayList;
      import java.util.Date;
      import java.util.List;
      import java.util.Scanner;
      
      public class Sample2 {
          private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
      
      public static void main(String[] args) throws FileNotFoundException {
      
          List<Date> l1 = new ArrayList<Date>();
          List<Integer> l2 = new ArrayList<Integer>();
      
          Scanner s = new Scanner(new FileReader("t1.txt"));
      
          while (s.hasNext()) {
              l1.add(getDate(s.next()));
              l2.add(s.nextInt());
          }
      
          s.close();
          System.out.println(l1);
          System.out.println(l2);
      }
      
      private static Date getDate(String next) {
          Date date = null;
          try {
              date = dateFormat.parse(next);
          } catch (ParseException e) {
              e.printStackTrace();
          }
          return date;
      }
      

      }

      【讨论】:

      • 更好的格式和解释会很好,但你有正确的想法。为什么会有一个未格式化的尾括号?
      • @Ramachandra Reddy,谢谢。但该列表以“Wed Jun 14 00:00:00 EDT 2017”格式而不是 yyyy-MM-DD 格式存储。
      • 是的。日期将仅以该格式存储。如果要保留“yyyy-MM-DD”格式,则必须将列表 l1 声明为 List 而不是 List
      • @Chid 这是Date.toString() method 的结果。实际上,date has no format
      • 虽然将日期解析为用于保存日期的内容是个好主意,但请不要教年轻人长期过时的课程DateSimpleDateFormat 和朋友。今天我们有了好多了:我推荐现代 Java 日期和时间 API,称为 java.time 或 JSR-310。从Oracle tutorial 开始。然后使用LocalDate。它的parse 方法甚至可以在没有任何显式格式化程序的情况下解析文件中的日期。
      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多