我遇到了一个题目,要从一个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++;
           
        }这是我程序的大体代码,请各位帮忙解决一下读取的问题,试验了很多次都不成功,谢谢了!

解决方案 »

  1.   

    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));
        }
    }
      

  2.   

    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* 州和州府之间的分隔符
      

  3.   

    1.显然用Map解决更好
    2.读取的话用String.split分割洲和首府
      

  4.   

    谢谢了,大家知道哪个网站有讲JAVA的正则表达式比较好的吗,我现在学的编程书讲这部分太少了,都不是很清楚
      

  5.   

    这里有这个帖子,你看一下对你是否有些帮助:
    http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html