2016-07-21 6 views
2

単語を個々の文字に分割しようとしています。Android String.split( "")が余分な要素を返す

私はString.split( "")とString.split( "|")の両方を試しましたが、単語を分割すると余分な空の要素が作成されています。 例:

word = "word"; 
    int n = word.length(); 
    Log.i("20",Integer.toString(n)); 
    String[] letters = word.split("|"); 
    Log.i("25",Integer.toString(letters.length)); 

Androidのモニターで、出力は次のとおりです。

07-21 15:50:23.084 5711-5711/com.strizhevskiy.movetester I/20: 4 
07-21 15:50:23.085 5711-5711/com.strizhevskiy.movetester I/25: 5 

私はTextViewのブロックに個々の文字を入れて、私は実際に余分な空のTextViewを見ることができます。 4.

私はほとんどこれは、メソッドのAndroidの実装では、実際のバグだと思うように誘惑しています:私は私の通常のJavaでこれらのメソッドをテストする場合

は、それが予想される答えを出力します。

+3

で変更あなたはrealllllly単一文字 'String'sの配列ではなく、あなたが希望' char'sの配列を必要とするいくつかの理由があります'word.toCharArray()'を使って取得しますか? – childofsoong

+1

いいえ、私はそれが動作するかどうかを確認しようとすることができます。しかし、それは一般的な方法が異なって働いているように見えるという問題に対処しません。私はすでに別の回避策を見つけましたが、なぜそれが機能しないのかを知りたいのです。 –

+3

これは、Javaバージョン7までの 'String#split'の予想される動作であり、Java 8で変更されました:[なぜJava 8 splitでは、結果配列の先頭で空の文字列が削除されるのですか?](http:// stackoverflow。 com/q/22718744) – Tom

答えて

0

ありがとうございます。私の現在の回避策は、モック配列を使用し、System.arraycopy()を使用して新しい配列にコピーすることです。

String[] mockLetters = word.split(""); 
int n = word.length(); 
String[] letters = new String[n]; 

System.arraycopy(mockLetters,1,letters,0,n); 

toCharArray()を使用することをお勧めします。しかし、これらの文字はTextViewsに入れられ、TextViewはcharを受け入れないようです。私は、粗い、それを動作させることができますが、私は現在持っているものに固執することを決めました。

Tomは、私の質問に答えて、私の根底にある問題に答えました: なぜString.split()はAndroidでJavaとは違った働きをしたのですか?

のstring.Split用どうやらルールは、()は、Java 8

+0

正直にその結果をアーカイブするための非常に遅く非論理的な方法 – Divers

+0

私はtoCharArray()を使用して、個々のcharをStringにキャストしてtextViewに入れることをお勧めしますか?それはさほど非効率的ではないようだ。または、個々の要素に分割されたStringをtextViewsに配置するより良い方法がありますか? –

+0

実際、Regexpの使用ははるかに効率的です。これは常に遅くなります。 'toCharArray'は非常に簡単なネイティブメソッドです。あなたが私のことを信じていなければ、パフォーマンステストをしてください。正直言って最大の問題は、あなたのコードがプログラマの大部分にとっては非常に不明確であることです。だからあなたの同僚はなぜそれをしているのか理解できません。 – Divers

-1

下のスペースが破棄されるように、以下のドキュメントごとに制限として0を渡してみてください。

String[] split (String regex, int limit)

nは、パターンは、できるだけ多くの回数として適用されるゼロである場合、配列は、任意の長さを有することができ、空の文字列の末尾が破棄されます。

+1

いいえ、動作しません – Divers

+1

残念ながら、これは同じ結果を返します。それは何の違いもありませんでした。 –

1

私はあなたがこれを行うにはしたく思っています:

public Character[] toCharacterArray(String s) { 

    if (s == null) { 
     return null; 
    } 

    int len = s.length(); 
    Character[] array = new Character[len]; 
    for (int i = 0; i < len ; i++) { 
     array[i] = new Character(s.charAt(i)); 
    } 

    return array; 
} 

代わりの区切り文字なしで単語を分割しますか?

こちらがお役に立てば幸いです。

+2

'String'には' toCharArray'というビルトインメソッドがあることをご存知ですか? – childofsoong

0

あなたがしていることが意味をなさないので、それがバグか予想される動作かどうかは言うまでもありません。論理OR(文字列だけでなくRegular expressionを待っているsplit)の文字列を分割しようとしています。その結果、Androidでは通常のJavaと比較して結果が異なる可能性があります。

とにかく、あなたが望むものを正常なやり方で実現する方法はたくさんあります。サイクル内の各文字で単語を繰り返し処理するか、単にtoCharArray文字列のメソッドを使用します。

+0

式について無効なものは何もありません。空文字列正規表現で使用する有効なもの。しかし、パイプは実際には冗長です。それは効果的に "空の文字列か空の文字列のどちらかにマッチする"と言っているからです。 – Iain

+0

@lain私はそれが無効であるとは言いませんでした。私はそういう意味にはならないと言いました。それはプログラマーの99%にとって予測が遅く遅いです。 – Divers

関連する問題