我要解决的问题是如何从文本文件中读取行并将其添加到数组中。然后,按照每个元素中的日期对这个新数组中的每个元素进行排序。我将对其进行解释,以使其更容易理解,但将解释我在做什么。
我的文本文件(第一列是姓名,第二列是出生日期,最后一个是该人的死亡日期):
sarah jones,1966-12-02,2018-12-04
matt smith,1983-02-03,2020-03-02
john smith,1967-03-04,2017-04-04
我想对这个文件进行排序,并按照死者的日期对它进行排序,然后将其输出到另一个文件(此刻通过打印到控制台进行测试)。我想到的一种方法是读取每一行并将其传递给数组。然后读取数组中的每个元素,将其拆分,然后将人员死亡的日期保存到另一个数组中。然后对具有死亡日期的数组进行排序,通过查看死亡日期数组的第一个元素是否与文本文件中第一行的第一个元素匹配来遍历两个数组,如果是,则将其写入另一个文件。如果没有,请转到下一行。
例如
BufferedReader reader = new BufferedReader(new FileReader("input_text.txt"));
PrintWriter outputStream = new PrintWriter(new FileWriter("output.txt",true));
ArrayList<String> lines = new ArrayList<String>();
ArrayList<String> substr_date = new ArrayList<String>();
String currentline = reader.readLine();
while(currentline !=null){
String a_line[] = currentline.split(",");
substr_date.add(a_line[2])
lines.add(currentline);
currentline = reader.readLine();
}
Collections.sort(substr_date);
for(String date : substr_date){
for(String line : lines){
if(line.contains(date)){
System.out.println(line);
}
}
}
我希望输出为:
john smith,1967-03-04,2017-04-04
sarah jones,1966-12-02,2018-12-04
matt smith,1983-02-03,2020-03-02
结果最初是按顺序排列的,但随后某些行会重复多次,然后整个文本文件会重复发送到控制台,并变得一团糟。我不确定该怎么做。我是java的新手,也不知道我是否正确地问了这个问题,所以如果您需要更多信息,请询问。
答案 0 :(得分:0)
您的做法远景。您可以以更简单的方式执行此操作。您可以像这样将比较器传递给Collections.sort()方法。
Collections.sort(substr_date, new Comparator<String>{
@Override
public int compare(String str1, String str2){
String dd1 = str1.split(",")[2];
String dd2 = str2.split(",")[2];
return dd1.compareTo(dd2);
}
});
但是,比较这样的日期并不是一个好方法。您应该将日期字符串转换为LocalDateTime,然后使用isBefore()或isAfter()进行比较。例如,
public int compare(String str1, String str2){
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd")
LocalDateTime d1 = LocalDateTime.parse(str1.split(",")[2],format);
LocalDateTime d2 = LocalDateTime.parse(str2.split(",")[2],format);
return d1.isBefore(d2)?-1:(d1.isAfter(d2)?1:0);
}
答案 1 :(得分:0)
我会为您可以插入列表的对象创建类,然后在该类上定义一个可用于排序的比较器。
这是您可以定义的类的示例:
static class DeceasedPerson {
String name;
LocalDate birthDate;
LocalDate deathDate;
DeceasedPerson(String name, LocalDate birthDate, LocalDate deathDate) {
this.name = name;
this.birthDate = birthDate;
this.deathDate = deathDate;
}
@Override
public String toString() {
return name + ", " + birthDate + ", " + deathDate;
}
}
然后,您可以简单地将基于此类的对象加载到列表中,然后使用比较器对列表进行排序。这里是一些示例代码,您可以使用上面定义的类运行该代码:
public static void main(String[] args) {
String input =
"matt smith,1983-02-03,2020-03-02\n" +
"sarah jones,1966-12-02,2018-12-04\n" +
"john smith,1967-03-04,2017-04-04\n";
List<DeceasedPerson> deceasedPersonList = new ArrayList<>();
try (Scanner scanner = new Scanner(input)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] array = line.split(",");
DeceasedPerson deceasedPerson = new DeceasedPerson(array[0],
LocalDate.parse(array[1]), LocalDate.parse(array[2]));
deceasedPersonList.add(deceasedPerson);
}
}
deceasedPersonList.sort(Comparator.comparing(o -> o.deathDate));
deceasedPersonList.forEach(System.out::println);
}
如果使用DeceasedPerson类运行以上代码,则应该在控制台上看到以下输出:
john smith, 1967-03-04, 2017-04-04
sarah jones, 1966-12-02, 2018-12-04
matt smith, 1983-02-03, 2020-03-02
实际上,您还可以在上面的main方法中使用TreeSet
代替List
,并获得相同的结果。这是一个简洁的举动:
public static void main(String[] args) {
String input =
"matt smith,1983-02-03,2020-03-02\n" +
"sarah jones,1966-12-02,2018-12-04\n" +
"john smith,1967-03-04,2017-04-04\n";
Set<DeceasedPerson> deceasedPersonList = new TreeSet<>(Comparator.comparing(o -> o.deathDate));
try (Scanner scanner = new Scanner(input)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] array = line.split(",");
DeceasedPerson deceasedPerson = new DeceasedPerson(array[0],
LocalDate.parse(array[1]), LocalDate.parse(array[2]));
deceasedPersonList.add(deceasedPerson);
}
}
deceasedPersonList.forEach(System.out::println);
}