我在 .txt 文件中有以下示例数据
111, Sybil, 21
112, Edith, 22
113, Mathew, 30
114, Mary, 25
所需的输出是
[{"number":"111","name":"Sybil","age":"21" },
{"number":"112","name":"Edith","age":"22"},
{"number":"113","name":"Mathew","age":"30"},
"number":"114","name":"Mary","age":"25"]
可悲的是,我并没有走多远,因为我似乎无法从每一行中取出 values 。相反,这是显示的内容
[一二三]
private void loadFile() throws FileNotFoundException, IOException {
File txt = new File("Users.txt");
try (Scanner scan = new Scanner(txt)) {
ArrayList data = new ArrayList<>() ;
while (scan.hasNextLine()) {
data.add(scan.nextLine());
System.out.print(scan.nextLine());
}
System.out.print(data);
}
我将不胜感激任何帮助。谢谢你
回答1
不太清楚要求。如果您只需要知道如何取出 values,请结合使用 String.split()
和 Scanner.nextLine()
。
以下代码:
private void loadFile() throws FileNotFoundException, IOException {
File txt = new File("Users.txt");
try (Scanner scan = new Scanner(txt)) {
ArrayList data = new ArrayList<>();
while (scan.hasNextLine()) {
// split the data by ", " and split at most (3-1) times
String[] input = scan.nextLine().split(", ", 3);
data.add(input[0]);
data.add(input[1]);
data.add(input[2]);
System.out.print(scan.nextLine());
}
System.out.print(data);
}
}
输出如下,您可以自己进一步修改:
[111, Sybil, 21, 112, Edith, 22, 113, Mathew, 30, 114, Mary, 25]
但是,如果您还需要所需的格式,我能得到的最接近的方法是使用 HaspMap
并将其放入 ArrayList
。
以下代码:
private void loadFile() throws FileNotFoundException, IOException {
File txt = new File("Users.txt");
try (Scanner scan = new Scanner(txt)) {
ArrayList data = new ArrayList<>();
while (scan.hasNextLine()) {
// Create a hashmap to store data in correct format,
HashMap<String, String> info = new HashMap();
String[] input = scan.nextLine().split(", ", 3);
info.put("number", input[0]);
info.put("name", input[1]);
info.put("age", input[2]);
// Put it inside the ArrayList
data.add(info);
}
System.out.print(data);
}
}
输出将是:
[{number=111, name=Sybil, age=21}, {number=112, name=Edith, age=22}, {number=113, name=Mathew, age=30}, {number=114, name=Mary, age=25}]
希望这个答案对您有所帮助。
回答2
目前,您正在跳线。 Scanner::nextLine
文档中的引用:
此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。
因此,您将在列表中添加一行,并将下一行写入控制台。
要从每一行获取数据,您可以使用支持 RegEx 的 String::split
方法。
例子:
"line of my file".split(" ")
回答3
我们可以使用流来编写一些紧凑的代码。
首先我们定义一个 record
来保存我们的数据。
Files.lines
将您的文件读入内存,产生一个字符串流,每行一个。
我们调用 Stream#map
来产生另一个流,一系列字符串 arrays。每个数组包含三个元素,即每行中的三个字段。
我们再次调用 map
,这次是为了生成 Person
对象流。我们通过解析行的三个字段中的每一个并将其传递给构造函数来构造每个人对象。
我们调用 Stream#toList
将这些人员对象收集到一个列表中。
我们调用 List#toString
来生成表示人员对象列表内容的文本。
record Person ( int id , String name , int age ) {}
String output =
Files
.lines( Paths.of("/path/to/Users.txt" ) )
.map( line -> line.split( ", " ) )
.map( parts -> new Person(
Integer.parseInt( parts[ 0 ] ) ,
parts[ 1 ] ,
Integer.parseInt( parts[ 2 ] )
) )
.toList()
.toString()
;
如果默认 Person#toString
方法的格式不适合您,请添加该方法的覆盖以生成所需的输出。