4

私はそれを部分文字列1122333344555566778888 にする必要がある文字列を持っています、そして結果としてそれを得る[11, 22, 3333, 44, 5555, 66, 77, 8888] ことができますそれを美しい方法で行うことは可能ですか、それとも私はそれをハードコーディングして8回使用するstring.substring(beginning, ending)関数を入れてから入れる必要がありarrayますか?

編集:文字列には、繰り返される数字だけでなく、含めることもできます。AB CG HERD KJ 98HQ 0K 1E OOQWそれも例です!

4

7 に答える 7

4

パターンを使用します:((\d)\2*)

String input = "1122333344555566778888";
Pattern p = Pattern.compile("((\\d)\\2*)");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println("Found " + m.group(1));
}

生成:

11
22
3333
44
5555
66
77
8888

編集:数字、スペース、文字がパターンを使用している場合(([\d\w\s])\2*)

于 2012-11-17T12:36:25.037 に答える
3

繰り返し文字の正規表現を使用できます:

String input = "1122333344555566778888";
String regex = "(\\w)\\1+";

Matcher m = Pattern.compile(regex).matcher(input);
String[] substrings = new String[input.length()];

int index = 0;

while (m.find())
    substrings[index++] = m.group();

for (int i = 0; i < index; i++)
    System.out.println(substrings[i]);

出力:

11
22
3333
44
5555
66
77
8888

重要な注意点:

substrings配列の長さは入力文字列の長さと等しいため、配列にはnullエントリが含まれます。文字列に繰り返しのない連続文字が含まれている場合、この配列にはnullエントリがない可能性があります。に注意しsubstringsNullPointerExceptionください。

于 2012-11-17T12:34:24.430 に答える
0

これで十分美しい?たった一行です...

String parts = input.replaceAll("(.)(?!\\1)", "$1\0").split("\0");

テストは次のとおりです。

public static void main(String[] args) {
    String input = "1122333344555566778888";
    String[] parts = input.replaceAll("(.)(?!\\1)", "$1\0").split("\0");
    System.out.println(Arrays.toString(parts));
}

出力:

[11, 22, 3333, 44, 5555, 66, 77, 8888]

このソリューションには非常に小さな問題が1つあることに注意してください$1。呼び出しの後にある文字replaceAll()は、入力に含めることができないようにする必要があります。かなり安全であるために、ヌル文字'\0'(つまり、16進ゼロ)を選択しました。

于 2012-11-17T13:25:36.657 に答える
0

この文字列には.split()を使用できる区切り文字はありません。11-22-3333-...などのサブ文字列にしたいものの間に区切り文字がある場合は、簡単に使用できます。

String[] splits = asseltClasses.split("-");
于 2012-11-17T12:34:48.300 に答える
0

BlueBulletの...に基づく

import java.util.regex.*;
import java.util.*;
public class MyTest {

    public static void main(String[] args) {

        String input = "1122333344555566778888";
        String regex = "(\\w)\\1+";

        Matcher m = Pattern.compile(regex).matcher(input);

        List<String> l = new ArrayList<String>();
        while (m.find()) l.add(m.group());

        System.out.println(Arrays.toString(l.toArray()));
    }   
}

出力:

[11, 22, 3333, 44, 5555, 66, 77, 8888]
于 2012-11-17T12:51:16.023 に答える
0

多分あなたはこれを使いたい:

var str="1122333344555566778888"; //whatever
b=0;outpt="";
while(b<=18){
if(b==4|b==10|b==18){e=4;p=4}else{e=2;p=2}
outpt+=str.substr(b,e)+", ";b+=p;}
alert(outpt);

出力:

11, 22, 3333, 44, 5555, 66, 77, 8888, 
于 2012-11-17T14:27:37.150 に答える
0

これが私がすることです: ソートされていない文字列 "ABCABCABC" が与えられた場合、それを Char[] 配列に変換してから Arrays.sort() を使用して AAABBBCCC に変換することでソートできます。

    public String[] sortThis(String inputData) {
    String input = "ABCABCABC"; //make this whatever you want (or set to inputData)
    String[] temp = new String[input.length()];
    for (int i = 0; i < input.length();i++) //initialize the array, or it prints "null"
        temp[i] = "";
    int index = 0;
    char[] info = input.toCharArray();
    Arrays.sort(info);

    for (int i = 0; i < input.length(); i++) { // fill the temp array
        temp[index] += info[i];
        if(i+1 < input.length())
            if(i < input.length() && info[i] != info[i+1])
                index++;
    }

    String[] answer = new String[index+1]; 
    for(int i = 0; i < index+1; i++) // shorten the array
        answer[i] = temp[i];

    return answer;
    }

出力:

    [AAA, BBB, CCC]
于 2012-11-17T13:30:58.093 に答える