我有一个名为" marathon"的文件,其中我有7个键:
用逗号分隔","。我必须将第二个键(时间)放在Treemap中。 目前我只想在控制台中显示时间。
所以这是我的代码:
public class Text {
@SuppressWarnings("resource")
public static void main(String[] args) throws FileNotFoundException {
try {
BufferedReader in = new BufferedReader(new FileReader("marathon"));
String str;
str = in.readLine();
while ((str = in.readLine()) != null) {
//System.out.println(str);
String[] ar=str.split(",");
System.out.println(ar[0]);
}
in.close();
} catch (IOException e) {
System.out.println("File Read Error");
}
}
}
这是文本的一行:
M,2:30:57.6,Harry Payne,GBR,1929-07-05,Stamford Bridge,England
当我启动我的代码示例的程序并输入System.out.println(ar[0]);
a[0]
时,向我展示了控制台中的第一行,以及M' s和F' s。但是当我提出a[1]
时会有例外:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
答案 0 :(得分:2)
正如其他人所指出的那样,在进入循环体之前,你会先读取两次,所以你会错过第一行。
但是你也没有检查readline导致格式正确的行。它可能是一个空行或一行,以某种其他方式不会产生您期望的数组。
所以你应该添加一个if语句来检查你有你想要的东西,比如......
public class Text {
@SuppressWarnings("resource")
public static void main(String[] args) throws FileNotFoundException {
try {
BufferedReader in = new BufferedReader(new FileReader("marathon"));
String str = "";
while ((str = in.readLine()) != null) {
String[] ar=str.split(",");
if(ar.length >= 7) {
System.out.println(ar[0] + ", " + ar[1]);
}
}
in.close();
} catch (IOException e) {
System.out.println("File Read Error");
}
}
}
答案 1 :(得分:0)
请尝试以下代码。它对我有用。
你应该只在while循环中读取一行。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Text {
@SuppressWarnings("resource")
public static void main(String[] args) throws FileNotFoundException {
try {
BufferedReader in = new BufferedReader(new FileReader("marathon"));
String str;
while ((str = in.readLine()) != null) {
//System.out.println(str);
String[] ar=str.split(",");
System.out.println(ar[0]);
System.out.println(ar[1]);
}
in.close();
} catch (IOException e) {
System.out.println("File Read Error");
}
}
}
答案 2 :(得分:0)
SortedMap<String, String[]> map = new TreeMap<>();
Path path = Paths.get("marathon");
Files.lines(path, Charsets.defaultCharset())
.map(line -> line.split(",\\s*"))
.peek(words -> {
if (words.length != 7) {
Logger.getLogger(getClass().getName()).info("Line wrong: " + line);
}
})
.filter(words -> words.length == 7)
.forEach(words -> map.put(word[1], words));
但是有一些CSV阅读器类,可以用逗号等处理带引号的字段。
答案 3 :(得分:0)
Java 8只是为了好玩
import java.io.IOException;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Stream;
import static java.nio.charset.Charset.defaultCharset;
import static java.lang.System.out;
import static java.nio.file.Files.lines;
public class Main {
public static void main(String[] args) throws IOException {
Map<String, String[]> map = new TreeMap<>( );
try( Stream<String> lines = lines(Paths.get("marathon"), defaultCharset())){
lines.map(line -> line.split( "," )).forEach( entry -> map.put(entry[1], entry ));
map.values().forEach( entry -> out.println(Arrays.toString( entry )) );
}
}
}