好的,所以我想从文件中读取内容。它们看起来像这样:
70 Fresno Credit Bureau Fresno CA 93714
我希望它成为碎片,70个进入int,Fresno Credit Bureau和Fresno进入单独的字符串,状态首字母变成单独的字符,最后将最后一个邮政编码提供给另一个int。 / p>
我试图使用Scanner零碎地阅读它,并且我试图将它作为字符串缓冲区读取并且无论如何都没有骰子。
while(gre.hasNextLine()){
imidate = gre.nextInt();
gre.skip(" ");
han = gre.next();
gre.skip(" ");
luke = gre.next();
gre.skip(" ");
bok = gre.next().charAt(0);
mander = gre.next().charAt(1);
gre.skip(" ");
imate = gre.nextInt();
theTree.addNode(imate, han, luke, bok, mander, imidate);
}
从某种情况来看,这可能会搞砸到某个地方的解析,但是我不知道在哪里。有什么建议?评论?顾虑?
答案 0 :(得分:1)
看起来你想在字符串中允许空格,将2+空格视为分隔符。为此,您需要为Scanner
的分隔符设置适当的模式:
Scanner gre = ...
gre.useDelimiter("\\s{2,}");
现在,对next
的调用将忽略Fresno Credit Bureau
内的空格,仅在两个或更多空格处打破。
这也可以让您摆脱skip
来电,因为Scanner
会跳过分隔符。
最后,这段代码看起来很可疑:
bok = gre.next().charAt(0);
mander = gre.next().charAt(1);
如果您尝试获取同一令牌的第一个和第二个字符,请在调用String
之前将其存储在charAt()
中。否则,您将访问两个不同令牌的字符:
String tok = gre.next();
bok = tok.charAt(0);
mander = tok.charAt(1);
答案 1 :(得分:0)
将该行拆分为String [],然后您可以将String数组的元素放入变量中。
喜欢:
String[] line = gre.split("\\s+");
imidate = Integer.parseInt(line[0]);
han = line[1];
etc ...
答案 2 :(得分:0)
由于每一行都包含不同类型的对象,因此您应该有一个类来处理它。例如,
class MyObject {
int number;
String name;
String city;
char[] state;
int zip;
public static MyObject fromLine(String line) {
String[] columns = line.split("\\s{2,}");
number = Integer.parseInt(columns[0]);
name = columns[1];
city = columns[2];
state = columns[3].toCharArray();
zip = Integer.parseInt(columns[4]);
}
}
如果文件中的每一行看起来与问题中的一行相似,则可以使用扫描仪或BufferedReader逐行读取文件,然后分别处理每行的处理。使用BufferedReader,您可以执行以下操作:
try (BufferedReader reader = new BufferedReader(new FileReader(vocabulary))) {
List<MyObject> myObjects = reader.lines()
.map(MyObject::fromLine)
.collect(Collectors.toList());
} catch (IOException e) { }
如果您使用的是标签,请使用"\\t+"
代替"\\s{2,}"
。