2016-08-05 4 views
0

における別のchar []を使用して区切りに私は、Javaの状況を持っています。分割チャーは[]のJava

result1 = {'a','r'} 
result2 = {'t','i'} 
result3 = {'s','t'} 

注:デリミタ発生が固定され、セキュリティ上の理由から私は - は: 例:

char[] input = { 'a', 'r', '|','t', 'i', '|','s', 't' }; 

所与入力文字配列のような3つの異なる文字列に分割されなければなりませんここで文字列を使用することはできません。

どのように私はjavaでこれを行うことができますか?

+0

So ...あなたは配列の読み方を知らないのですか?配列の作成方法は?文字を比較する方法?何が問題なのですか? – shmosel

+0

結果の配列はすべて 'result' {number}という名前になりますか?例: 'result4'、' result5'など – brijs

答えて

0

あなたがこの新しいchar []がどれくらいの量であるかわからないなら、それはやりにくいと思います。あなたのコンパイラは、あなたが必要とするchar [](あなたが名前を付けてアクセス可能なもの)の数を知る必要があります。

私の最初のアイデアは、それを文字列に連結してから、区切り文字を使用して分割することでした。しかし、あなたは文字列を使いたくない/できないと書いています。

これはむしろ回避策ですが、char []配列の配列を作成することができます。 forやforeachのようなものを使用すると、これらの文字が基本配列の要素に追加されます。

それはいくつかのより具体的な質問を追加しようとしないで、あなたが探していると場合であれば、私にコメントをお願いします。

0

私は、これが最良List<char[]>(分割数が予め分かっている場合でも)で得られた文字列を収集することによって解決されると思います。

分割自体は、入力配列をステップ実行し、文字を区切り文字と比較することで実行できます。区切り文字が見つかった場合は、新しいchar[]に現在位置と最後見つかっ区切りの位置の間の文字列を抽出し、リストにそれを追加します。入力配列の終わりに達するまで繰り返す。

分割数があらかじめ分かっている場合は、char[][]をあらかじめその番号に割り当てることができますが、次に挿入する場所を自分で追跡する必要があります。char[]

0

は、あなただけの区切り文字のインデックスを追跡する必要があり、その後、あなたの新しい結果のchar配列に対応する文字を割り当てることができます。

は、たとえば、あなたはこのようにいくつかのコードを試すことができます。

import java.util.Arrays; 
import java.util.ArrayList;; 
public class Test { 
public static void main(String[] args) { 
    char[] input = { 'a','i', '|','s', 'r','d', '|','t', 'c','i', '|','s', 't' }; 

    int[] indexOfDelimiter=new int[input.length]; 
    indexOfDelimiter[0]=-1; 
    int j=1; //track of delimiter index 
    for (int i=0;i<input.length;i++){ 
     if (input[i]=='|'){ 
      indexOfDelimiter[j++]=i; // get the position of the delimiter 
     } 
    } 
    indexOfDelimiter[j]=input.length; 

    //now you can get the result char arrays like: 
    ArrayList<char[]> results=new ArrayList<>(); 
    for(int i=0;i<j;i++){ 
     char[] chars=Arrays.copyOfRange(input,indexOfDelimiter[i]+1, indexOfDelimiter[i+1]); 
     results.add(chars); 
    } 

    //for retrieving the char arrays, you can do like this: 
    for(int i=0;i<results.size();i++){ 
     System.out.println(results.get(i)); 
    } 
    // the output is : 
    // ai 
    // srd 
    // tci 
    // st 
    } 
} 
0

の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があまり決定的でない場合など)、ストリームは良好です。