web-dev-qa-db-ja.com

n番目の位置ごとに文字列を分割します

この正規表現を使用して、3番目の位置ごとに文字列を分割します。

String []thisCombo2 = thisCombo.split("(?<=\\G...)");

ここで、Gの後の3つのドットは、分割するn番目ごとの位置を示します。この場合、3つの点は3つの位置ごとを示します。例:

Input: String st = "123124125134135145234235245"
Output: 123 124 125 134 135 145 234 235 245.

私の質問は、文字列を分割する必要がある位置の数をユーザーに制御させるにはどうすればよいですか?言い換えれば、ユーザーが制御するこれらの3つのドット、nドットを作成するにはどうすればよいですか?

29
Emile Beukes

パフォーマンスを大幅に改善するための代替策は、ループでsubstring()を使用することです。

_public String[] splitStringEvery(String s, int interval) {
    int arrayLength = (int) Math.ceil(((s.length() / (double)interval)));
    String[] result = new String[arrayLength];

    int j = 0;
    int lastIndex = result.length - 1;
    for (int i = 0; i < lastIndex; i++) {
        result[i] = s.substring(j, j + interval);
        j += interval;
    } //Add the last bit
    result[lastIndex] = s.substring(j);

    return result;
}
_

例:

_Input:  String st = "1231241251341351452342352456"
Output: 123 124 125 134 135 145 234 235 245 6.
_

stevevls 'solution ほど短くはありませんが、より効率的です(以下を参照)、より簡単だと思いますもちろん、状況に応じて、将来的に調整します。


パフォーマンステスト(Java 7u45)

2,000文字の長い文字列-間隔は3です。

split("(?<=\\G.{" + count + "})")パフォーマンス(ミリ秒単位):

_7, 7, 5, 5, 4, 3, 3, 2, 2, 2
_

splitStringEvery()substring())パフォーマンス(ミリ秒単位):

_2, 0, 0, 0, 0, 1, 0, 1, 0, 0
_

2,000,000文字の長い文字列-間隔は3です。

split()パフォーマンス(ミリ秒単位):

_207, 95, 376, 87, 97, 83, 83, 82, 81, 83
_

splitStringEvery()パフォーマンス(ミリ秒単位):

_44, 20, 13, 24, 13, 26, 12, 38, 12, 13
_

2,000,000文字の長い文字列-間隔は30です。

split()パフォーマンス(ミリ秒単位):

_103, 61, 41, 55, 43, 44, 49, 47, 47, 45
_

splitStringEvery()パフォーマンス(ミリ秒単位):

_7, 7, 2, 5, 1, 3, 4, 4, 2, 1
_

結論:

splitStringEvery()メソッドははるかに高速ですthe change in Java = 7u6 )、間隔が長くなるとエスカレートします

すぐに使えるテストコード:

Pastebin.com/QMPgLbG9

44
Aske B.

ブレース演算子を使用して、文字が発生する必要がある回数を指定できます。

String []thisCombo2 = thisCombo.split("(?<=\\G.{" + count + "})");

ブレースは、正確なカウントまたは範囲を指定するために使用できるため、便利なツールです。

29
stevevls

Google Guava を使用すると、 Splitter.fixedLength() を使用できます

文字列を指定された長さの断片に分割するスプリッターを返します

Splitter.fixedLength(2).split("abcde");
// returns an iterable containing ["ab", "cd", "e"].
19
epoch

その正規表現文字列を作成する場合は、分割長をパラメーターとして設定できます。

public String getRegex(int splitLength)
{
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < splitLength; i++)
        builder.append(".");

    return "(?<=\\G" + builder.toString() +")";
}
0
The Cat
private String[] StringSpliter(String OriginalString) {
    String newString = "";
    for (String s: OriginalString.split("(?<=\\G.{"nth position"})")) { 
        if(s.length()<3)
            newString += s +"/";
        else
            newString += StringSpliter(s) ;
    }
    return newString.split("/");
}
0
newMaziar