2017-09-12 8 views
0

定義に基づいて文字列ベースのメッセージを分割したい。文字列を分割してオブジェクトをインスタンス化する

String: AAABBB CCDDD FFGGGHHHI  KKK 
    Definition: 2,6,3,1,6,7,rest 
    So, 
    2 AA 
    6 ABBB C 
    3 CDD 
    1 D 
    6  F 
    7 FGGGHHH 
    rest I  KKK 

理想的には、メッセージを分割し、理想的であろうオブジェクトをインスタンス化するJavaまたは春に既存の機構が存在する場合。

+1

[Javaで文字列を分割する方法]の可能な重複(https://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java) – UmarZaii

答えて

0
StringBuilder temp=new StringBuilder("AAABBB CCDDD FFGGGHHHI  KKK"); 
System.out.println(temp.substring(0,2)); 
temp.delete(0,2); 
System.out.println(temp.substring(0,6)); 
temp.delete(0,6); 
//it goes like this 

使用StringBuilder、あなたがストリングの削除に続く部分文字列を取得毎回。 メイクsubstring(int start, int end)方法を使用するとdelete(int start, int end)

+0

'String s =" AAABBB CCDDD FFGGGHHHI KKK "というコンテンツを削除するのではなく、オフセットを適用するだけで元の文字列に直接' substring'を実行できるので、 'StringBuilder'の操作は時代遅れです。 System.out.println(s.substring(0、2)); System.out.println(s.substring(2,8)); '。最初の場所で 'System.out.append(s、0、2).append( '\ n').append(s、2、8).println();' ...サブシーケンスを出力することもできます... – Holger

+0

はい、 'String''' substring()'メソッドを使って印刷することができますが、OPは更新された 'String'に対して' substring() '演算を実行したいと考えました。 'StringBuilder'は変更可能なので、私は追加の' String'変数を作る代わりにそれを使用しました。 –

0

まず、あなたのカウントにエラーをした、これは自分のものを行うにはいくつかのコードです:

public static void main(String[] args) { 
    String str = "AAABBB CCDDD FFGGGHHHI  KKK"; 
    int[] split = new int[]{2, 6, 3, 1, 6, 7}; 
    List<String> res = new ArrayList<>(); 
    StringBuilder temp = new StringBuilder(str); 

    for (int i = 0; i < split.length ; i++) { 
     res.add(temp.substring(0, split[i])); 
     temp.delete(0, split[i]); 
    } 
    res.add(temp.toString()); 

    res.forEach(System.out::println); 
} 

、出力は次のとおりです。

AA   // 2 
ABBB C  // 6 
CDD  // 3 
D   // 1 
    FF  // 6 
GGGHHHI // 7 
    KKK // rest 
0

これは私のバージョンです

String str = "AAABBB CCDDD FFGGGHHHI  KKK"; 
    List<Integer> def = Arrays.asList(2,6,3,1,6,7); 

    List<String> res = split (str, def); 
    int n = res.size(); 
    for (int i = 0; i < n; i ++) { 
     String r = res.get(i); 
     if (i + 1 == n) { 
      System.out.println("rest: " + r); 
     } else { 
      System.out.println(r.length() + " : " + r); 
     } 
    } 

public List<String> split (String pStr, List<Integer> pDef) { 
    List<String> ret = new ArrayList<String>(); 
    int startStr = 0; 
    int startDef = 0; 
    while (startStr < pStr.length() && startDef < pDef.size()) { 
     int end = startStr + pDef.get(startDef); 
     ret.add(pStr.substring(startStr, end)); 
     startStr = end; 
     startDef ++; 
    } 
    if (startStr < pStr.length()) { 
     ret.add(pStr.substring(startStr)); 
    } 
    return ret; 
} 

出力:

2 : AA 
6 : ABBB C 
3 : CDD 
1 : D 
6 :  FF 
7 : GGGHHHI 
rest:  KKK 
2

これはsubstringはない正確に何...あなたがする必要がある

static String[] split(String source, int ... sizes){ 
    int n = source.length(), start = 0; 
    String [] partials = new String[sizes.length]; 

    for(int i = 0; i < sizes.length; i++){ 
    int end = sizes[i] < 0 ? n : start + sizes[i]; 
    partials[i] = source.substring(start, start = end); 
    } 

    return partials; 
} 

ことの一つは、例えば、-1restを翻訳されている。

static String[] split(String source, String sizes){ 
    return split(source, Arrays.stream(sizes.split(",")) 
        .mapToInt(it -> it.equals("rest") ? -1 : Integer.parseInt(it)) 
        .toArray()); 
} 

次に、split(String, String)を使用して方法を達成することができます。例えば:

String string = "AAABBB CCDDD FFGGGHHHI  KKK"; 
String definition = "2,6,3,1,6,7,rest"; 

String[] results = split(string, definition); 
//  ^--- ["AA", "ABBB C", "CDD", "D", " FF", "GGGHHHI", "  KKK"] 
関連する問題