Java - 从文本文件中读取并将item(字符串,arrayList)添加到哈希映射



这是文本文件:output1.txt

zzz ***Wed Jan 15 10:00:03 +08 2020
a : 20
b : 30
c : 40
zzz ***Wed Jan 15 11:00:03 +08 2020
a : 22
b : 24
c : 25

我正在尝试将字符串中的日期和 a,b,c 作为ArrayList添加到哈希映射中:

期望输出:

{zzz ***Wed Jan 15 10:00:03 +08 2020=[a : 20, b : 30, c : 40],
zzz ***Wed Jan 15 11:00:03 +08 2020=[a : 22, b : 24, c : 25]}

我的代码:

String dateString ="";
ArrayList<String> value = new ArrayList<String>();
HashMap<String, ArrayList> result = new HashMap<String, ArrayList>();
String fileName = "/Users/--/Downloads/output1.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("zzz")) {
dateString = line;
} else {
value.add(line);
}
result.put(dateString, value);
}
System.out.println(result);

我得到的结果是:

{zzz ***Wed Jan 15 10:00:03 +08 2020=[a : 20, b : 30, c : 40, a : 22, b : 24, c : 25], 
zzz ***Wed Jan 15 11:00:03 +08 2020=[a : 20, b : 30, c : 40, a : 22, b

下面是示例代码。

我们使用Scanner来解析输入字符串的每一行。扫描程序对象在资源试用中定义,该对象将自动关闭。

我们使用DateTimeFormatter定义日期时间格式模式,以匹配您的时髦输入。提示:向数据发布者介绍 ISO 8601 标准,该标准定义了将日期时间值交换为文本的实用格式。

作为我们的键,我们解析每四行中的第一行以获取一个OffsetDateTime对象。这是我们Map的关键.我们的地图被具体地定义为一个TreeMap,以保持键按时间顺序排序。

我们构建了一个Integer数字的List,这些数字是从预期的"a,b,c"值解析而来的。我们使用新的List.of功能进行简单的语法,以构建未知具体类型的List对象。List将元素按添加它们的顺序保存,因此我们知道第一个是a,第二个是b,第三个是c

String s = "zzz ***Wed Jan 15 10:00:03 +08 2020n" +
"a : 20n" +
"b : 30n" +
"c : 40n" +
"zzz ***Wed Jan 15 11:00:03 +08 2020n" +
"a : 22n" +
"b : 24n" +
"c : 25";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "'zzz ***'EEE MMM dd HH:mm:ss x uuuu" ).withLocale( Locale.US );
Map < OffsetDateTime, List < Integer > > momentCounts = new TreeMap <>();
try (
Scanner scanner = new Scanner( s ) ;
)
{
while ( scanner.hasNextLine() )
{
OffsetDateTime moment = OffsetDateTime.parse( scanner.nextLine() , f );
List < Integer > counts = List.of(
Integer.valueOf( scanner.nextLine().replace( "a : " , "" ) ) ,
Integer.valueOf( scanner.nextLine().replace( "b : " , "" ) ) ,
Integer.valueOf( scanner.nextLine().replace( "c : " , "" ) )
);
momentCounts.put( moment , counts );
}
}
System.out.println( "momentCounts = " + momentCounts );

运行时。

momentCounts = {2020-01-15T10:00:03+08:00=[20,

30, 40], 2020-01-15T11:00:03+08:00=[22, 24, 25]}

只需在阅读以"zzz"开头的新行之前初始化新数组。

String fileName = "/Users/--/Downloads/output1.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("zzz")) {
dateString = line;
value = new ArrayList<>();
} else {
value.add(line);
}
result.put(dateString, value);
}
System.out.println(result);