のJava 8
救助
難読化に!
import java.util.ArrayList;
import java.util.List;
import java.util.Spliterator;
import java.util.function.Consumer;
public class Test {
public static void main(String[] args) {
char[] input = { 'a', 'r', '|','t', 'i', '|','s', 't' };
List<Spliterator<Character>> spliterators= new DelimiterSpliterator(input, '|').tryAllSplits();
List<char[]> splits= spliterators.stream().collect(ArrayList<char[]>::new, (result, element) -> result.add(((DelimiterSpliterator) element).toCharArray()), ArrayList<char[]>::addAll);
for (char[] split : splits) {
System.out.println(split);
}
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Spliterator;
public class DelimiterSpliterator implements Spliterator<Character> {
private final char[] array;
private final char delimiter;
private int start;
private final int end;
public DelimiterSpliterator(char[] array, char delimiter) {
this(array, delimiter, 0, array.length);
}
private DelimiterSpliterator(char[] array, char delimiter, int start, int end) {
this.array = array;
this.delimiter = delimiter;
this.start = start;
this.end = end;
}
public char[] toCharArray() {
return Arrays.copyOfRange(array, start, end);
}
public List<Spliterator<Character>> tryAllSplits() {
// Collects all splits.
List<Spliterator<Character>> result = new ArrayList<>();
Spliterator<Character> s = trySplit();
while (s != null) {
result.add(s);
s = trySplit();
}
result.add(this);
return result;
}
@Override
public int characteristics() {
return IMMUTABLE | ORDERED | SIZED | SUBSIZED;
}
@Override
public long estimateSize() {
return end-start;
}
@Override
public boolean tryAdvance(Consumer<? super Character> action) {
if (start < end) {
action.accept(array[start++]);
return true;
} else {
return false;
}
}
@Override
public Spliterator<Character> trySplit() {
// Returns a new Spliterator that cannot be split further, from left to right.
for (int i = start; i < end - 1; i++) {
if (array[i] == delimiter) {
final int origStart = start;
start = i + 1;
return new DelimiterSpliterator(array, delimiter, origStart, i);
}
}
return null;
}
}
注:可能なパフォーマンスの問題オートボクシング/アンボクシングに関連in the javadocを述べたように。
入力が大きい場合、特に結果の順序が重要でない場合(ストリームがパラレルになる可能性があり、trySplitがあまり決定的でない場合など)、ストリームは良好です。
出典
2016-08-06 05:16:44
alt
So ...あなたは配列の読み方を知らないのですか?配列の作成方法は?文字を比較する方法?何が問題なのですか? – shmosel
結果の配列はすべて 'result' {number}という名前になりますか?例: 'result4'、' result5'など – brijs