1

編集:解決策を見つけました-

/**
 * Returns the arguments of the method. Ensures inner methods are intact.
 *
 * @param fullMethod full method string
 * @return arguments of the method
 */
public static String[] getArguments(String fullMethod) {
    String innerFirstBrackets = fullMethod.substring(fullMethod.indexOf("(") + 1, fullMethod.lastIndexOf(")"));
    if (innerFirstBrackets.contains("(") && innerFirstBrackets.contains(")")) {
        List list = new List();
        int count = 0;
        int lastComma = 0;
        for (int x = 0; x < innerFirstBrackets.length(); x++) {
            if (innerFirstBrackets.charAt(x) == '(') {
                count ++;
            } else if (innerFirstBrackets.charAt(x) == ')') {
                count --;
            }
            if (innerFirstBrackets.charAt(x) == ',' || x == innerFirstBrackets.length() - 1) {
                if (count == 0) {
                    list.add(innerFirstBrackets.substring((lastComma == 0 ? -1 : lastComma) + 1,
                            (x == innerFirstBrackets.length() - 1 ? x + 1 : x)).trim());
                    lastComma = x;
                }
            }
        }
        return list.getItems();
    } else {
        // No inner methods
        return innerFirstBrackets.split(",");
    }
}

Stringメソッドの表現内で引数を取得しようとしています。これまでのところ、ほとんどの場合に成功していますが、特定のケースでは機能しません。

これが私が現在持っているコードです:

/**
 * Returns the arguments of the method. Ensures inner methods are intact.
 *
 * @param fullMethod full method string
 * @return arguments of the method
 */
public static String[] getArguments(String fullMethod) {
    String innerFirstBrackets = fullMethod.substring(fullMethod.indexOf("(") + 1, fullMethod.lastIndexOf(")"));
    if (innerFirstBrackets.contains("(") && innerFirstBrackets.contains(")")) {
        List list = new List();
        boolean first = false, second = false;
        int lastComma = 0;
        for (int x = 0; x < innerFirstBrackets.length(); x++) {
            if (innerFirstBrackets.charAt(x) == '(') {
                first = !second;
            } else if (innerFirstBrackets.charAt(x) == ')') {
                second = true;
            }
            if (first && second) {
                first = second = false;
            }
            if (innerFirstBrackets.charAt(x) == ',' || x == innerFirstBrackets.length() - 1) {
                if (!first) {
                    list.add(innerFirstBrackets.substring((lastComma == 0 ? -1 : lastComma) + 1,
                            (x == innerFirstBrackets.length() - 1 ? x + 1 : x)).trim());
                    lastComma = x;
                }
            }
        }
        return list.getItems();
    } else {
        // No inner methods
        return innerFirstBrackets.split(",");
    }
}

これは、引数としてメソッドがある場合に機能しますが、引数としてメソッドを持つ複数の引数がある場合には機能しません。これはよくあることではありませんが、コードに脆弱性があるのは好きではありません。

うまくいく方法の例

get(get(1,2));

また

get(get(get(get(1,2))));

また

get(get(1),get(1));

しかし、このようなものが与えられるとうまくいきません

get(get(get(1)),get(1));

次のかっこを見つけるだけでなく、姉妹のかっこを見つける方法がわかりません。(姉妹括弧の意味がわからない場合は、ほとんどの IDE で、一方の括弧を強調表示すると、もう一方の括弧が自動的に強調表示されることを考えてみてください。EX.ここに画像の説明を入力

4

2 に答える 2

3

アルゴリズムでコンマが問題になる理由がわかりません。あなたができることは、右から文字のスキャンを開始し((左括弧から始めていると仮定して)、カウンターを0に初期化し、そして:

  • 遭遇するたびにカウンターを増やします(
  • 遭遇するたびにカウンターをデクリメントします)

カウンターが再びゼロに達すると、一致するペアが見つかります。注意する必要があるのは、コードが一重引用符または二重引用符の中にランダムな括弧を含む引用符付き文字列だけです(これらをカウンターに適用する必要はありません)。

于 2012-10-19T04:14:53.873 に答える
1

かっこだけを気にする場合は、単純なカウンターを維持して、一致するかっこを見つけることができます。

擬似コード:

int start=-1, end=-1;
int paren_depth = 0;
for(int i=0; i<length; i++) {
    if(str[i] == '(') {
        if(paren_depth == 0) start = i;
        paren_depth++;
    } else if(str[i] == ')') {
        paren_depth--;
        if(paren_depth == 0) {
            end = i;
            break;
        }
    }
}

// get substring from start to end

他の句読点も処理したい場合は、スタックを使用して句読点コンテキストを保存するか、単に再帰を使用する必要があります (括弧が表示されたら再帰し、閉じ括弧が見つかったら戻ります)。

于 2012-10-19T04:15:49.063 に答える