1

私は括弧を見つける必要がある文字列を持っています(){}[]およびスタックを使用して正確さをチェックし、間違いがある場合は間違いの位置を出力します。したがって、それらを char 配列に分割してから、シンボルごとにチェックし、マップが一致する場合は、スタックに/からプッシュ/ポップするメソッドを実行します。

私は次のように想像します。

ParentStack s = new ParentStack();
Map<Character, Method> map = new HashMap<Character, Method>();
map.put('(', s.push('('));
map.put(')', s.pop()); //then check if its opposite 

では、このようなことはありますか?または、スイッチを使用する必要がありますか?

4

3 に答える 3

1

Java は関数型プログラミング言語ではないため (関数はいわゆる第一級市民です)、参照によって関数を渡すことはできません。代わりにできることは、 example と呼ばれる 1 つのメソッドを持つインターフェイスを作成することですexecute()。次に、必要な関数ごとにこのインターフェイスを実装し、これらをマップに配置します。これらの関数を簡単に呼び出してこれらの「関数」を実行できます。

public interface function{
    void execute();
}

(Java 8 では) コードは次のようになります。

ParentStack s = new ParentStack();
Map<Character, Method> map = new HashMap<Character, Method>();
map.put('(', (Function) () -> s.push('('));
map.put(')', (Function) () -> s.pop());

次のように書く人もいます。

map.put('(', () -> s.push('('));

読みやすいとは思いませんが、それは好みの問題です。

使用を実行するにFunctionは:

map.get('(').execute();
于 2016-02-14T23:46:09.823 に答える
0

BooleanSupplierの代わりに使用しMethodます。

    Stack<Character> s = new Stack<>();
    Map<Character, BooleanSupplier> map = new HashMap<>();
    map.put('(', () -> { s.push('('); return true; });
    map.put(')', () -> !s.isEmpty() && s.pop() == '(');

と、こんな感じでチェック。

    String str = "((ab)c)";
    int errorAt = -1;
    for (int i = 0; i < str.length(); ++i) {
        char c = str.charAt(i);
        if (map.containsKey(c))
            if (!map.get(c).getAsBoolean()) {
                errorAt = i;
                break;
            }
    }
    if (errorAt == -1 && s.isEmpty())
        System.out.println("OK!");
    else if (errorAt == -1)
        System.out.println("error at " + str.length());  // too few ')'
    else
        System.out.println("error at " + errorAt);  // too many ')'

または、ストリーム API を使用できます。

    int errorAt = IntStream.range(0, str.length())
        .filter(i -> map.containsKey(str.charAt(i)))
        .reduce(-1, (p, i) -> p >= 0 || map.get(str.charAt(i)).getAsBoolean() ? p : i);
于 2016-02-15T00:32:16.473 に答える