1

私はそのような関数を書きたい:

- Input: "1" -> return : "1"
- Input: "12" -> return : ["1","2"]

関数 split() を使用する場合:String.valueOf("12").split("") -> ["","1","2"] しかし、結果だけを取得したい: ["1","2"].

これを行う最善の方法は何ですか?

実際、私はそれを行うことができます:

private List<String> decomposeQuantity(final int quantity) {
    LinkedList<String> list = new LinkedList<String>();
    int parsedQuantity = quantity;
    while (parsedQuantity > 0) {
        list.push(String.valueOf(parsedQuantity % 10));
        parsedQuantity = parsedQuantity / 10;
    }
    return list;
}

しかし、感情的なコードを持つために split() を使用したい

4

5 に答える 5

3
String input = "123";
String regex = "\\d";
Matcher m = Pattern.compile(regex).matcher(input);

String[] output = new String[input.length()];
int index = 0;

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

for (String s : output)
    System.out.println(s);
于 2012-11-01T03:31:31.517 に答える
1

2 つの数字の間の場所を記述するには、ルックアラウンドメカニズムを使用できます。次に例を示します。

String[] digits= "12".split("(?<=\\d)(?=\\d)"); //->[1, 2]
//(?<=\\d) points place before digit
//(?=\\d) points place after digit
//(?<=\\d)(?=\\d) place that is before one digit and after another

後読みsplitのみを使用できますが、(?<=\\d)それでも機能します

String[] digits= "123".split("(?<=\\d)"); //->[1, 2, 3]
于 2012-11-01T03:59:51.610 に答える
1

分割だけではできません。最初の要素を削除する (インデックス 1 から始まる別の配列にコピーする) かs.toCharArray()、文字列ではなく文字の配列を返す必要があります。

于 2012-11-01T03:39:11.220 に答える
0
public String[] split(String input) {
    if (input.length() == 0) {
        return new String[] { "" };
    }

    String[] output = new String[input.length()];
    int index = 0;
    for (char c : input.toCharArray()) {
        output[index++] = Character.toString(c);
    }

    return output;
}


split("") -> [""]
split("1") - > ["1"]
split("12") - > ["1", "2"]
split("123") - > ["1", "2", "3"]
于 2012-11-01T04:04:23.000 に答える
0

読みやすさと保守性とパフォーマンスが必要な場合、ソリューションは異なります。投稿されたすべての回答をテストし、基本的な実装を試した後、最高のパフォーマンスは基本的な実装でした。これはより多くのコードですが、役に立つかもしれません:

public interface IEvaluable {
    void evaluate();
}

public class BasicImplementation implements IEvaluable {

    private String string;

    public BasicImplementation(String string) {
        this.string = string;
    }

    //using the power of shadowing
    public String[] getDigitsAsArray(String string) {
        String[] data = new String[string.length()];
        int j = 0;
        for(int i = 0; i < string.length(); i++) {
            if (Character.isDigit(string.charAt(i))) {
                data[j++] = Character.toString(string.charAt(i));
            }
        }
        String[] realData = new String[j];
        for(int i = 0;i < j ;i++) {
            realData[i] = data[i];
        }
        return realData;
    }

    @Override
    public void evaluate() {
        getDigitsByArray(string);
    }
}

回答のパフォーマンスをテストするために、結果をテストする方法を実装しました。

public final class PerformanceEvaluator {

    private IEvaluable evaluable;

    public PerformanceEvaluator(IEvaluable evaluable) {
        this.evaluable = evaluable;
    }

    public void evaluate() {
        long initialTime;
        long endTime;
        initialTime = System.nanoTime();
        try {
            evaluable.evaluate();
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
        endTime = System.nanoTime();
        System.out.println("Ellapsed time: " + (endTime - initialTime));
    }
}

そしてメインクラス

public class Main {

    public static void main(String[] args) {
        Main oMain = new Main();
        oMain.evaluate("12");
        oMain.evaluate("123456789098_)(56765432145");
        oMain.evaluate("wbfiwyfwbn74g0t3h7t394mhg983hhon504n0er0n");
        oMain.evaluate(
            "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
        oMain.evaluate("no digits");
    }

    public void evaluate(String string) {
        PerformanceEvaluator performanceEvaluator =
            new PerformanceEvaluator(new BasicImplementation(string));
        performanceEvaluator.evaluate();
    }
}

IEvaluable提供されたソリューションとのインターフェースを実装する他のクラスを作成し、自分でテストしてください。テストは、Ubuntu 12.04 LT 上の 8 GB RAM を搭載した Intel® Core™ i7-2675QM CPU @ 2.20GHz × 8 上の Java 1.7.0_09 HotSpot 64 ビット サーバー VM で行われました。

これらのテストケースだけに基づく私の意見では:

  • 正規表現を使用してパフォーマンスを優先する場合は、@BlueBullet の回答を選択してください。
  • に固執したい場合はString#split、@Pshemoの回答を選択してください。
于 2012-11-01T04:40:10.833 に答える