关于useDelimiter的问题,试了好久还是不知道原理是什么

leogriv 2010-02-19 01:34:50
我遇到了一个题目,要从一个txt文件中读取美国的州以及州的首府,然后让用户来输入随机出现的州的首府的名字,判断是否写对了

我的思路是建立一个二维数组来存储州名和相对应的首府名称,但是在读取文件的时候遇到了一些问题:

1. txt文件中的格式基本如下:
Alabama - Montgomery
Alaska - Juneau
Arizona - Phoenix
Arkansas - Little Rock
California - Sacramento
当我以空格来作为分隔符的时候,例如像Little Rock这样的首府名称就会被拆分成了两个单词,从而导致数组长度超出

2. 有些州的名字例如 North Carolina这样的,本身就会有一个空格在里面,就会出现同样的问题,我对于第一个问题的解决方法是用.nextLine来读取,这样就能把整个首府的名称都读取在一个数组空间里面,但是对于州的名字用什么办法才能完整的读取而不被空格影响呢

3. 对于中间的那个“-”该怎么处理呢,我用了useDelimiter("- ")这样的方法来处理,但是老是得不到理想的结果,不知道该怎么写参数才能正确读取格式

File myFile = new File("d:\\stateCapitals.txt");

Scanner input = new Scanner(myFile).useDelimiter(" -");
Scanner input1 =new Scanner(myFile).useDelimiter(" ");

String[][] SC = new String[50][3];


int b = 0;
while (input.hasNext()) {

SC[b][0] = input.next();
SC[b][1] = input1.next();
SC[b][2] = input.nextLine();
b++;

}

这是我程序的大体代码,请各位帮忙解决一下读取的问题,试验了很多次都不成功,谢谢了!
...全文
368 8 打赏 收藏 转发到动态 举报
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦_枫 2010-02-20
  • 打赏
  • 举报
回复
引用 7 楼 bao110908 的回复:
这里有这个帖子,你看一下对你是否有些帮助:
http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html


这个网站不错哦
  • 打赏
  • 举报
回复
这里有这个帖子,你看一下对你是否有些帮助:
http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html
leogriv 2010-02-19
  • 打赏
  • 举报
回复
谢谢了,大家知道哪个网站有讲JAVA的正则表达式比较好的吗,我现在学的编程书讲这部分太少了,都不是很清楚
knightzhuwei 2010-02-19
  • 打赏
  • 举报
回复
\\s 正则表示空字符
leogriv 2010-02-19
  • 打赏
  • 举报
回复
能帮忙解释下\\s是什么意思吗,是不是正则表达式的东西,我看到网上一些例子也是这么用,我正则表达式的部分好像掌握的不好
fatRoach 2010-02-19
  • 打赏
  • 举报
回复
1.显然用Map解决更好
2.读取的话用String.split分割洲和首府
  • 打赏
  • 举报
回复
import java.util.List;
import java.util.LinkedList;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class StateParser {

public static void main(String[] args) throws FileNotFoundException {
StateParser parser = new StateParser();
List<State> states = parser.parse("i:/test/test.txt");
for(State state : states) {
System.out.println(state);
}
}

public List<State> parse(String filename) throws FileNotFoundException {
Scanner s = new Scanner(new File(filename)).useDelimiter("\\s*(?:\r?\n|^|$)\\s*|\\s*-\\s*");
List<State> states = new LinkedList<State>();
while(s.hasNext()) {
State state = new State(s.next(), s.next());
states.add(state);
}
return states;
}
}

public class State {
private String state;
private String capital;

public State() {
}

public State(String state, String capital) {
this.state = state;
this.capital = capital;
}

public void setState(String state) {
this.state = state;
}
public String getState() {
return this.state;
}

public void setCapital(String capital) {
this.capital = capital;
}
public String getCapital() {
return this.capital;
}

public String toString() {
return "state: " + this.state + ", capital: " + this.capital + "|";
}
}


将一些零星的空格,以及州和州府之间的"-"作为扫描器的分隔符

\\s*(?:\r?\n|^|$)\\s* 去除换行符前后的空格,以及开头和结尾的空格
|
\\s*-\\s* 州和州府之间的分隔符
knightzhuwei 2010-02-19
  • 打赏
  • 举报
回复
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;

public class Main {
public static void main(String[] args) throws Exception {
String[][] ins = new String[5][2];
int i = 0;
BufferedReader br = new BufferedReader(new FileReader(new File(
"d:/stateCapitals.txt")));
String s = "";
while ((s = br.readLine()) != null) {
String[] ss = s.split(" - ");
ins[i][0]=ss[0];
ins[i++][1]=ss[1].trim();
}
br.close();
System.out.println(Arrays.deepToString(ins));
}
}
相关推荐

62,568

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告