0

以前はコンマで区切るとコードは完全に機能しましたが、セミコロンでは機能しなくなりました。

カンマで:

public void loadXXXData() {
    InputStream is = getResources().openRawResource(R.raw.xxxdata);

    try
    {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        try { 
            String line; 
            String[] RowData;
            RowData = new String[XXXVARNUM];
            for(int i=0;i<NUMBEROFXXX;i++){
                //Read the line.
                line = reader.readLine();
                //Cut the line up.
                RowData = line.split(",",XXXVARNUM);
                for(int j=0;j<XXXVARNUM;j++){
                    //Distribute the line into a 2D array.
                    XXX[i][j] = RowData[j];
                }
            }
            //Populate forms
            setCurrentXXX(XXX);
        } 
        catch (IOException ex) { 
            Log.v("XXXdex", "I/O Exception: Could not read from the I/O stream.");
        }
        finally { 

            try { 
                //Close the stream
                is.close(); 
            } 
            catch (IOException e) {
                Log.v("XXXdex", "I/O Exception: Could not close the I/O stream.");
            }
            finally {

            }
        } 

    }
    finally {

    }
}

セミコロンで:

public void loadItemData() {
    InputStream is = getResources().openRawResource(R.raw.items);

    try
    {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        try { 
            String line; 
            String[] RowData;
            RowData = new String[ITEMVARNUM];
            for(int i=0;i<NUMBEROFITEMS;i++){
                //Read the line.
                line = reader.readLine();
                //Cut the line up.
                RowData = line.split(";",ITEMVARNUM);
                for(int j=0;j<ITEMVARNUM;j++){
                    //Distribute the line into a 2D array.
                    ITEM[i][j] = RowData[j];
                }
            }
            //Populate forms
            setCurrentItem(item);
        } 
        catch (IOException ex) { 
            Log.v("XXXdex", "I/O Exception: Could not read from the I/O stream.");
        }
        finally { 

            try { 
                //Close the stream
                is.close(); 
            } 
            catch (IOException e) {
                Log.v("XXXdex", "I/O Exception: Could not close the I/O stream.");
            }
            finally {

            }
        } 

    }
    finally {

    }
}

xxxDataからのサンプル:

 1,dinosaur,Grass,Poison,45,49,49,65,65,45,Supergrow,,DrPhyll,64,0,0,0,1,0,0,45,0.7 m,6.9 kg,Seed

...完全にロードされます。

itemDataからのサンプル:

 Antidote;A spray-type medicine. It lifts the effect of poison from one XXX.;Route 3, Pinwheel Forest, Pinwheel Forest, Pinwheel Forest (With Dowsing Machine), Icirrus City Shop Route 9, Accumula Town, Striaton City, Nacrene City, Castelia City, Nimbasa City, Driftveil City, Mistralton City, Icirrus City, Opelucid City, XXX League, Lacunosa Town, Undella Town, Black City, White Forest

...正しく分割されません。どうしたの?「;」を表す正規表現を探してフォーラムを調べましたが、何も機能しません。String.splitが文字列を正しい数の文字列に分離していないため、arrayIndexOutOfBounds例外が発生し続けます。

4

5 に答える 5

1

問題はおそらく、定数を上限として配列をループしていることです。

RowData = line.split(";",ITEMVARNUM);
            for(int j=0;j<ITEMVARNUM;j++){
                //Distribute the line into a 2D array.
                ITEM[i][j] = RowData[j];
            }

使ってみてください

for(int j=0;j<RowData.length;j++){

代わりは。

しかし、あなたの質問に答えるために、はい、あなたはセミコロンで分割することができます、コメントのいくつかが示唆しているように、それを試してみて、それが機能することを確認してください。

編集:そしてまた、あなたは分割法の2番目のパラメータが何をするのか誤解していると思います。これは単なる上限であり、指定した数の空の位置を持つ配列は作成されません。結果の配列がそれより大きくならないように制限されます。

Edit2:この行は完全に冗長であり、削除する必要があります。コードが詰まって混乱するだけです。

RowData = new String[ITEMVARNUM];

Edit3:わかりました、私が見る基本的な問題は、境界としていくつかの未知の変数を使用しているということです。indataを正しく追跡し、それに応じてこれらの変数を変更すれば、うまくいく可能性があります。しかし、代わりに実際のデータを操作するためのより良い方法です。このコードを試したことはありませんが、動作するはずです(おそらくいくつかのマイナーな調整が必要です)

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        try { 
            String line=""; 
            String[] RowData;
            List<String[]> itemList = new ArrayList<String[]>();

            while(line!=null){
                //Read the line.
                line = reader.readLine();
                //Cut the line up.
                RowData = line.split(";");
                itemList.add(RowData);
            }
            String[][] item = new String[itemList.size()][];
            for(int i=0; i<itemList.size(); i++){
                item[i] = itemList.get(i);
            }
            //Populate forms
            setCurrentItem(item);

渦を巻いて、機能するかどうかを確認します。

于 2013-02-19T09:47:45.030 に答える
1

予想よりも少ない列を含む行がいくつかある可能性があります。例外をキャッチして、行の内容や使用しているパーツなどの追加データをログに記録してみてください。

Eclipseで例外ブレークポイントを設定して、デバッグを試すこともできます。


テストデータに欠陥があります。これを試して:

Antidote;A spray-type medicine. It lifts the effect of poison from one XXX.;Route 3; Pinwheel Forest; Pinwheel Forest; Pinwheel Forest (With Dowsing Machine); Icirrus City Shop Route 9; Accumula Town; Striaton City; Nacrene City; Castelia City; Nimbasa City; Driftveil City; Mistralton City; Icirrus City; Opelucid City; XXX League; Lacunosa Town; Undella Town; Black City; White Forest
于 2013-02-19T09:49:56.553 に答える
0

この単純な分割方法を試してください。ここでは、コンマとスペースで分割しています。

temp=”10054, 10055, 10056, 10035, 10052, 10036, 10037, 10038″;
String[] url = temp.split(",\\s+");

これは、
url = [10054、10055、10056、10035、10052、10036、10037、10038]を取得した結果です。

あなたが理解したことを願っています

詳細については、このブログを参照してください。アマランのブログ

私はまた別の質問でこれを見つけましたこれはあなたを助けるかもしれません 同様の問題

于 2013-02-19T09:46:40.717 に答える
0
public static void main(String[] args) {
    String str = "Antidote;A spray-type medicine. It lifts the effect of poison from one XXX.;Route 3, Pinwheel Forest, Pinwheel Forest, Pinwheel Forest (With Dowsing Machine), Icirrus City Shop Route 9, Accumula Town, Striaton City, Nacrene City, Castelia City, Nimbasa City, Driftveil City, Mistralton City, Icirrus City, Opelucid City, XXX League, Lacunosa Town, Undella Town, Black City, White Forest";
    String[] s = str.split(";");
    System.out.println(s.length);
    for(String string: s)
        System.out.println(string);
}

サンプル入力を指定すると、文字列は3つの部分に分割され、RowDataのサイズは3になります。したがって、ITEMVARNUMが3より大きい場合、arrayIndexOutOfBounds例外が発生します。

RowData = line.split(";",ITEMVARNUM);
for(int j=0;j<ITEMVARNUM;j++){
  //Distribute the line into a 2D array.
   ITEM[i][j] = RowData[j];
} 
于 2013-02-19T10:06:39.363 に答える
0

それを理解しました...私がウェブサイトからデータをコピーして貼り付けたとき、「ショップ」の前後に.txtファイルに何とか保存された行末文字がありました。メモ帳でどうやって見えないのかわかりませんが、「Shop」という単語をセミコロンに置き換えて、4つのフィールドを作りました。これ以上の混乱はありません。アイデアをありがとう。

于 2013-02-20T03:56:58.013 に答える