2

ここでJavaを初めて使用します。文字列をオブジェクト内の変数に分割しようとしています。タイトルが示すように、文字列の最後のフィールドは最初のフィールドと一緒に分割されます。

私のtxtファイルからの行は、他のすべての行と同じです。

出力は次のとおりです。

Rolling Stone#Jann Wenner#Bi-Weekly#Boston#9000
Rolling Stone#Jann Wenner#Bi-Weekly#Philadelphia#8000
Rolling Stone#Jann Wenner#Bi-Weekly#London#10000
The Economist#John Micklethwait#Weekly#New York#42000
The Economist#John Micklethwait#Weekly#Washington#29000
Nature#Philip Campbell#Weekly#Pittsburg#4000
Nature#Philip Campbell#Weekly#Berlin#6000

    Exception in thread "main" java.lang.NumberFormatException: For input string: "9000 Rolling Stone"

9000 は整数値でなければなりません。そして、最後のインデックスは次の行にジャンプします # 何をすべきか?

このくらいのコードで十分だと思います

    static ArrayList<String> al = new ArrayList<String>(); // Consists of lines of the text file
    static ArrayList<Magazine> bl = new ArrayList<Magazine>(); // Consists of Magazine objects

for (int i = 0; i < al.size(); i++) {
                String result[] = al.get(i).split("\\#");
                for (int j = 0; j < result.length; j++) {
                    System.out.println(result[0] + "1 " + result[1] + "2 " +  result[2] + "3 " +  result[3] + "4 "+  result[4]);
                    int num = Integer.parseInt(result[4]);

私はどこか近いスプリット( "\#")でスパイダーセンスを持っていますが、何がわかりません...

ペーストビン: http://pastebin.com/Vp9T6aSd

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Magazine {

    private String MagazineName;
    private String Publisher;
    private String Frequency;
    private String City;
    private String objectName = "mg" + loopCount;
    private int Distribution;
    private static int loopCount = 0;

    static ArrayList<String> al = new ArrayList<String>(); // Consists of lines of the text file
    static ArrayList<Magazine> bl = new ArrayList<Magazine>(); // Consists of Magazine objects

    private static void readData() throws FileNotFoundException {
        java.io.File file = new java.io.File(
                "/Users/henrydang/Desktop/Zines.txt");
        Scanner sc = new Scanner(file);
        while (sc.hasNext()) {
            sc.useDelimiter("\\n");
            String line = sc.next();
            System.out.println(line);
            al.add(line);
            Magazine objectName;

            for (int i = 0; i < al.size(); i++) {
                String result[] = al.get(i).split("#");
                for (int j = 0; j < result.length; j++) {
                    System.out.println(result[0] + "1 " + result[1] + "2 " +  result[2] + "3 " +  result[3] + "4 "+  result[4]);
                    int num = Integer.parseInt(result[4]);

                    objectName = new Magazine();
                    objectName.setMagazine(result[0]);
                    objectName.setPublisher(result[1]);
                    objectName.setFrequency(result[2]);
                    objectName.setCity(result[3]);
                    objectName.setDistribution(num);
                    bl.add(objectName);             
                }

            }
            loopCount++;
            sc.close();

        }
    }

    public Magazine() {

    }

    public void setMagazine(String name) {
        this.MagazineName = name;
    }

    public void setPublisher(String name) {
        this.Publisher = name;
    }

    public void setFrequency(String name) {
        this.Frequency = name;
    }

    public void setCity(String name) {
        this.City = name;
    }

    public void setDistribution(int num) {
        this.Distribution = num;
    }

    public String getMagazine() {
        return MagazineName;
    }

    public String getPublisher() {
        return Publisher;
    }

    public String getFrequency() {
        return Frequency;
    }

    public String getCity() {
        return City;
    }

    public int getDistribution() {
        return Distribution;
    }

    public static void main(String args[]) throws FileNotFoundException {
        readData();
    }

}

編集: 詳細情報 解決済み: テキスト ファイルの末尾が "/n" ではなく /r/n である

4

2 に答える 2

0

だからヘンリー...

コードに関するいくつかの問題:

  1. sc.close() がwhile (sc.hasNext()){}ループ内で呼び出されていました。
  2. sc.hasNext() 内で呼び出される sc.setDelimiter() は非常に怪しいですが.next()、区切り文字を設定した後に呼び出すと機能します。
  3. 問題はコード自体ではなく、入力ファイル自体にあることがわかりました。\nプラットフォーム固有のコード (区切り文字など) を記述している場合は、常にファイルを再確認してください。

そして、コードにスキャナーを使用する適切な/理想的な方法を使用したコードを次に示します。

private static void readData() throws FileNotFoundException {  
  java.io.File file = new java.io.File("Zines.txt");  
  Scanner sc = new Scanner(file);  
  while (sc.hasNextLine()) {  
    String line = sc.nextLine();  
  }  
  sc.close();  
}

それがすべて役に立ったことを願っています!

編集: 以下のコメントの会話は無視してください。私たちは怒っていません、私は答えをやり直しました。

于 2013-01-13T13:09:40.683 に答える
0

私はあなたが試すことができると思います:

String result[] = al.get(i).split("#\\s*");

「#」が発生するたびに部分文字列を区切ります。

于 2013-01-13T13:11:00.020 に答える