JavaScriptでは、これが3文字ごとに文字列を分割する方法です
"foobarspam".match(/.{1,3}/g)
Javaでこれを行う方法を理解しようとしています。ポインタはありますか?
次のようにできます:
String s = "1234567890";
System.out.println(Java.util.Arrays.toString(s.split("(?<=\\G...)")));
生成するもの:
[123, 456, 789, 0]
正規表現(?<=\G...)
は、last match(\G
)に続く文字(...
)before it((?<= )
)
Javaは完全な機能を備えた分割ユーティリティを提供していないため、 Guavaライブラリ は次のようにします。
Iterable<String> pieces = Splitter.fixedLength(3).split(string);
SplitterのJavadoc を確認してください。それは非常に強力です。
import Java.util.ArrayList;
import Java.util.List;
public class Test {
public static void main(String[] args) {
for (String part : getParts("foobarspam", 3)) {
System.out.println(part);
}
}
private static List<String> getParts(String string, int partitionSize) {
List<String> parts = new ArrayList<String>();
int len = string.length();
for (int i=0; i<len; i+=partitionSize)
{
parts.add(string.substring(i, Math.min(len, i + partitionSize)));
}
return parts;
}
}
Bart Kiers answerへの追加として、3つの文字を表す正規表現で...
を使用する代わりに.{3}
を記述できることを追加したい同じ意味を持ちます。
その場合、コードは次のようになります。
String bitstream = "00101010001001010100101010100101010101001010100001010101010010101";
System.out.println(Java.util.Arrays.toString(bitstream.split("(?<=\\G.{3})")));
これにより、文字列の長さを変更することが容易になり、入力文字列の長さが可変の関数の作成が合理的になりました。これは、次のように実行できます。
public static String[] splitAfterNChars(String input, int splitLen){
return input.split(String.format("(?<=\\G.{%1$d})", splitLen));
}
IdeOneの例: http://ideone.com/rNlTj5
遅刻。
以下は、1つのライナーであるJava8ストリームを使用した簡潔な実装です。
String foobarspam = "foobarspam";
AtomicInteger splitCounter = new AtomicInteger(0);
Collection<String> splittedStrings = foobarspam
.chars()
.mapToObj(_char -> String.valueOf((char)_char))
.collect(Collectors.groupingBy(stringChar -> splitCounter.getAndIncrement() / 3
,Collectors.joining()))
.values();
出力:
[foo, bar, spa, m]
これは遅い答えですが、とにかく新しいプログラマーが見ることができるように、私はそれを公表しています:
正規表現を使用したくない場合、andサードパーティのライブラリに依存したくない場合は、代わりにこのメソッドを使用できます。 8992および10011でのナノ秒2.80 GHz CP(ミリ秒未満)。サイモン・ニッカーソンの例ほどきれいではありませんが、動作します:
/**
* Divides the given string into substrings each consisting of the provided
* length(s).
*
* @param string
* the string to split.
* @param defaultLength
* the default length used for any extra substrings. If set to
* <code>0</code>, the last substring will start at the sum of
* <code>lengths</code> and end at the end of <code>string</code>.
* @param lengths
* the lengths of each substring in order. If any substring is not
* provided a length, it will use <code>defaultLength</code>.
* @return the array of strings computed by splitting this string into the given
* substring lengths.
*/
public static String[] divideString(String string, int defaultLength, int... lengths) {
Java.util.ArrayList<String> parts = new Java.util.ArrayList<String>();
if (lengths.length == 0) {
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
while (string.length() > 0) {
if (string.length() < defaultLength) {
parts.add(string);
break;
}
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
}
} else {
for (int i = 0, temp; i < lengths.length; i++) {
temp = lengths[i];
if (string.length() < temp) {
parts.add(string);
break;
}
parts.add(string.substring(0, temp));
string = string.substring(temp);
}
while (string.length() > 0) {
if (string.length() < defaultLength || defaultLength <= 0) {
parts.add(string);
break;
}
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
}
}
return parts.toArray(new String[parts.size()]);
}
また、n番目の文字ごとに文字列を分割して、それぞれをListの各インデックスに配置することもできます。
ここで、Sequenceという名前の文字列のリストを作成しました。
リスト<文字列>シーケンス
それから基本的に、文字列「KILOSO」を2単語ごとに分割します。したがって、「KI」「LO」「SO」は、シーケンスと呼ばれるリストの個別のインデックスに組み込まれます。
ストリングS = KILOSO
Sequence = Arrays.asList(S.split( "(?<=\G ..)"));
だから私がやっているとき:
System.out.print(シーケンス)
それは印刷する必要があります:
[KI、LO、SO]
私が書くことができることを確認するために:
System.out.print(Sequence.get(1))
それは印刷されます:
LO