私は、ファイルから読んでいることを、未知の長さの文字列から、未知の長さの単語を取得する方法を見つけ出すのに苦労してきました。文字列から、私が欲しい言葉は常にによって分離されています「」および/または「&」文字列全体を引用符で囲まれています。EX: ".Word.Characters&数字&Letters.Typos&Mistypes。" 私は、それぞれの場所を知っています「」そして「&」だけでなく、それらが発生した回数。
私は言葉がで区切られているか否かに基づいて、配列の例[I] [J]に言葉を送りたいです「」または「&」。言葉が間に含まれるので、「」配列のJ行に「&」によってリンクアレイと言葉のI列に設定されます。
入力文字列は、単語の大部分は可変数を含めることができます。関心の1つの単語だけ、または百+ができることを意味します。
私はこの問題を解決するために配列を使用することを好むだろう。私が何を読んでから、正規表現は遅いが、仕事だろう。スプリット()もよい仕事が、私は言葉が手の前に探すために知っている必要があるだろうと思います。
この文字列から: ".Word.Characters&数字&Letters.Typos&Mistypes" 私が得ることを期待したい。(気にせずに行または列であるかについて)
[NULL] [単語]、[NULL]、[]、
[文字]、[番号]、[手紙]]、
[タイプミス]、[Mistypes]、[NULL]
この文字列から「.Alpha.Beta.Zeta&イオタ。」私が得ることを期待したいです。
[[アルファ]、[ヌル]]、
[ベータ]、[ゼロ]、
[ゼータ]、[イオタ]
//NumerOfPeriods tells me how many word "sections" are in the string
//Stor[] is an array that holds the string index locations of "."
for(int i=0;i<NumberOfPeriods;i++)
{
int length = Stor[i];
while(Line.charAt(length) != '"')
{
length++;
}
Example[i] = Line.substring(Stor[i], length);
}
//This code can get the words separated by "." but not by "&"
//Stor[] is an array that holds all string index locations of '.'
//AmpStor[] is an array that holds all string index locations of '&'
int TotalLength = Stor[0];
int InnerLength = 0;
int OuterLength = 0;
while(Line.charAt(TotalLength) != '"')
{
while(Line.charAt(OuterLength)!='.')
{
while(Line.charAt(InnerLength)!='&')
{
InnerLength++;
}
if(Stor[i] > AmpStor[i])
{
Example[i][j] = Line.substring(Stor[i], InnerLength);
}
if(Stor[i] < AmpStor[i])
{
Example[i][j] = Line.substring(AmpStor[i],InnerLength);
}
OuterLength++;
}
}
//Here I run into the issue of indexing into different parts of the array i & j
これは私が(それはあなたのコードは全く異なるのですが、それは動作します)あなたの問題を解決するだろう方法です。
まず第一に、引用符と先頭と末尾の非単語の文字を削除します。これは、使用して行うことができますreplaceAll
。
String Formatted = Line.replaceAll( "(^\"[.&]*)|([.&]*\"$)", "" );
最初の引数の正規表現は終了し、先頭と末尾の両方で二重引用符と一致します.
sおよび&
sの。2番目の引数が空の文字列(それが空の文字列に置き換えます)であるため、この方法では、マッチした文字が削除され新しい文字列を返します。
今、あなたはそれぞれの時にこの文字列を分割することができます.
使用split
方法を。あなただけのこの呼び出しの後、あなたの出力配列を定義することができます。
String[] StringGroups = Formatted.split( "\\." );
String[][] Elements = new String[StringGroups.length][];
エスケープバックスラッシュを(使用する\\
ことがで分割する必要があることを示すために、ポイントの前に).
このメソッドは、正規表現(だけにかかるため、-characters .
任意の非改行文字で分割)。
今、それぞれにその配列内の各文字列を分割&
同じ使用split
方法を。あなたに直接結果を追加しElements
、配列:
// Loop over the array
int MaxLength = 0;
for( int i = 0; i < StringGroups.length; i ++ ) {
String StrGroup = StringGroups[ i ];
String[] Group = StrGroup.split( "&" );
Elements[ i ] = Group;
// Measure the max length
if( Group.length > MaxLength ) {
MaxLength = Group.length;
}
}
Aは、\\
以降、入力のために必要ではない&
だけで試合の&
-characters。今、あなただけの配列にデータを入力する必要があります。MaxLength
変数は、追加するためであるnull
あなたの配列に値を。あなたがそれらをしたくない場合は、単にそれらを削除し、あなたはここで終了です。
あなたがしたい場合はnull
、あなたの要素の配列を超える値が、ループをし、新しいアレイに現在の行をコピーします。
for( int i = 0; i < Elements.length; i ++ ) {
String[] Current = Elements[ i ];
String[] New = new String[ MaxLength ];
// Copy existing values into new array, extra values remain null
System.arraycopy( Current, 0, New, 0, Current.length );
Elements[ i ] = New;
}
さて、Elements
配列は、あなたが望む正確に何が含まれています。
ここでは、完全な実行可能なコードは次のとおりです。
public class StringSplitterExample {
public static void main( String[] args ) {
test( "\".Word.Characters&Numeric&Letters.Typos&Mistypes.\"" );
System.out.println(); // Line between
test( "\".Alpha.Beta.Zeta&Iota.\"" );
}
public static void test( String Line ) {
String Formatted = Line.replaceAll( "(^\"[.&]*)|([.&]*\"$)", "" );
String[] StringGroups = Formatted.split( "\\." );
String[][] Elements = new String[StringGroups.length][];
// Loop over the array
int MaxLength = 0;
for( int i = 0; i < StringGroups.length; i ++ ) {
String StrGroup = StringGroups[ i ];
String[] Group = StrGroup.split( "&" );
Elements[ i ] = Group;
// Measure the max length
if( Group.length > MaxLength ) {
MaxLength = Group.length;
}
}
for( int i = 0; i < Elements.length; i ++ ) {
String[] Current = Elements[ i ];
String[] New = new String[ MaxLength ];
// Copy existing values into new array, extra values remain null
System.arraycopy( Current, 0, New, 0, Current.length );
Elements[ i ] = New;
}
for( String[] Group : Elements ) {
for( String String : Group ) {
System.out.print( String );
System.out.print( " " );
}
System.out.println();
}
}
}
この例の出力:
Wordのヌルヌル 文字数値文字 タイプミスMistypesヌル アルファヌル ベータヌル ゼタイオタ
この作品はそう、あなたはどこまでも知る必要はありません.
し、&
文字があなたの文字列です。Javaはあなたのためだけにそれを行います。