3

テキストファイルを読み取り、目的の値を取得するためのスキャナークラスを作成しました。テキストファイルにが含まれていると仮定しましょう。

人のリスト:長さ3

1:Fnjiei:ID 7868860:18歳

2:Oipuiieerb:ID 334134:39歳

3:エネカリー:ID 6106274:31歳

名前とID番号と年齢を取得しようとしていますが、コードを実行しようとするたびに例外が発生します。これが私のコードです。java gurusからの提案はありますか?:)それは1行を読むことができました.......しかし1行のテキストしか読めませんでした。

    public void readFile(String fileName)throws IOException{
    Scanner input = null;
    input = new Scanner(new BufferedReader(new FileReader(fileName)));
    try {
        while (input.hasNextLine()){
            int howMany = 3;
            System.out.println(howMany);
            String userInput = input.nextLine();
            String name = "";
            String idS = "";    
            String ageS = "";
            int id;
            int age;
            int count=0; 
            for (int j = 0; j <= howMany; j++){
                for (int i=0; i < userInput.length(); i++){
                    if(count < 2){ // for name
                        if(Character.isLetter(userInput.charAt(i))){
                            name+=userInput.charAt(i); // store the name
                        }else if(userInput.charAt(i)==':'){
                            count++;
                            i++;
                        }
                    }else if(count == 2){ // for id
                        if(Character.isDigit(userInput.charAt(i))){
                            idS+=userInput.charAt(i); // store the id
                        }
                        else if(userInput.charAt(i)==':'){
                            count++;
                            i++;
                        }
                    }else if(count == 3){ // for age
                        if(Character.isDigit(userInput.charAt(i))){
                            ageS+=userInput.charAt(i); // store the age
                        }
                    }
                    id = Integer.parseInt(idS); // convert id to integer
                    age = Integer.parseInt(ageS); // convert age to integer
                    Fighters newFighters = new Fighters(id, name, age);
                    fighterList.add(newFighters);
                }
                userInput = input.nextLine();
            }
        }
    }finally{
        if (input != null){
            input.close();
        }
    }
}

私の単なるコードが変更を求めた場合の私の謝罪。

編集それは私に数値形式の例外を与えます!!! これらの値の間にいくつの空きスペースがあるかわかりません。

4

3 に答える 3

4

ScannerこれはAPIのみを使用するソリューションです。重要なのはfindInLineです。入力形式のわずかな構文上のバリエーションを処理できますが、非常に読みやすく、派手な正規表現や魔法の配列インデックスは必要ありません。

    String text =
        "List  of @#%^$ people : length  3  !@%# \n" + 
        "1 :   Fnjiei   : ID 7868860 ::: Age 18\n" +
        "   2: Oipuiieerb : ID 334134 : Age 39 (old, lol!) \r\n" + 
        " 3 : Enekaree : ID 6106274 => Age 31\n";
    Scanner sc = new Scanner(text);

    sc.findInLine("length");
    final int N = sc.nextInt();

    for (int i = 0; i < N; i++) {
        sc.nextLine();
        sc.findInLine(":");
        String name = sc.next();
        sc.findInLine("ID");
        long id = sc.nextLong();
        sc.findInLine("Age");
        int age = sc.nextInt();
        System.out.printf("[%s] %s (%s)%n", id, name, age);
    }

これは印刷します:

[7868860] Fnjiei (18)
[334134] Oipuiieerb (39)
[6106274] Enekaree (31)

APIリンク

  • Scanner.findInLine(Pattern pattern)
    • 区切り文字を無視して、指定されたパターンの次の出現を見つけようとします。
    • パフォーマンスが問題になる場合は、このPattern.compileオーバーロードを使用してください
于 2010-06-07T12:15:20.737 に答える
3

これは短いようです:

public void readFile(String fileName)throws IOException
    {
        Scanner input = null;
        input = new Scanner(new BufferedReader(new FileReader(fileName)));
        String userInput;
        try
        {
            while (input.hasNextLine())
            {
                userInput = input.nextLine().trim();
                if (userInput.length() > 0)
                {
                    String[] userInfo = userInput.split(":");
                    int count = Integer.parseInt(userInfo[0].trim());
                    String name = userInfo[1].trim();
                    int id = Integer.parseInt(userInfo[2].trim().split("\\s+")[1].trim());
                    int age = Integer.parseInt(userInfo[3].trim().split("\\s+")[1].trim());

                    System.out.println("Count: " + count + " Name: " + name + " ID:" + id + " Age:" + age);
                }
                Fighters newFighters = new Fighters(id, name, age);
                fighterList.add(newFighters);
            }


        }
        finally
        {
            if (input != null)
            {
                input.close();
            }
        }
    }

あなたが私たちに持っている入力のために、それはこれを印刷します:

カウント:1名前:Fnjiei ID:7868860年齢:18

カウント:2名前:Oipuiieerb ID:334134年齢:39

カウント:3名前:エネカリーID:6106274年齢:31

分割方法の詳細については、こちらをご覧ください。基本的に、最初に:区切り文字として行を分割し、次に、を使用して再度分割し\\s+ます。これは、基本的に文字列を分割し、空白で区切られた単語を含む配列を返します。

于 2010-06-07T10:42:46.903 に答える
2
Scanner input = null;
input = new Scanner(new BufferedReader(new FileReader("filename")));

    try{
       while(input.hasNextLine()){
         String userInput = input.nextLine();
         String[] data = userInput.split(":");
         System.out.println("Name: "+data[1]+" ID:"+data[2].split("\\s+")[2]+
            "  Age:"+data[3].split("\\s+")[2]);

            }
        }finally{

            if(input != null) 
             input.close();
     }

上記のスニペットは基本的な考え方を示しています。また、これは最適なソリューションではない可能性があることに注意してください。

于 2010-06-07T10:36:56.373 に答える