簡體   English   中英

Java StringTokenizer考慮括號

[英]Java StringTokenizer considering parentheses

我正在創建一個將布爾邏輯表達式標記化並返回標記字符串數組的程序。 以下是我的代碼:

public static String[] tokenize(String s)
{
    String delims = "+";
    StringTokenizer st = new StringTokenizer(s, delims);
    String[] tokens = new String[st.countTokens()];

    int i=0;
    while (st.hasMoreElements()) {
        tokens[i++] = st.nextElement().toString();
    }

    return tokens;
}

例如,我將以下字符串作為輸入:

A + B +(C + D +(A + B))+(B + C)

使用我擁有的代碼,它將僅生成以下令牌:

A
B
(C
D
(A
B))
(B
C)

是否可以(使用相同的代碼結構)提出這些標記? 如果沒有,它如何編碼?

A
B
(C+D+(A+B))
(B+C)
    ArrayList<String> tokens = new ArrayList<String>();
    String current = "";
    int counter = 0;
    for(int i = 0 ; i < input.length(); i++)
    {
        char c = input.charAt(i);
        if(counter==0 && c=='+')
        {
            tokens.add(current);
            current = "";
            continue;
        }
        else if(c=='(')
        {
            counter++;
        }
        else if(c==')')
        {
            counter--;
        }
        current += c;
    }
    tokens.add(current);

這是我的評論的解決方案:

您可以一次遍歷一個字符,當您到達+時而不用括號括起來,保存到此讀取的字符,然后開始一個新的字符集。 跟蹤是否在括號中的方法是使用計數器。 當您點擊一個圓括號時,您將計數器加1,當您點擊一個圓括號時,您將計數器減1。如果計數器> 0,則位於括號中。 哦,如果counter變為負數,則該字符串無效,並且如果counter最后不為0,則該字符串也無效。

您可以檢查計數器並返回false或其他內容,以表明它是無效的字符串。 如果您知道該字符串是有效的,則可以按原樣運行。 您可以使用tokens.toArray()從ArrayList中獲取一個數組。

如果您可以找到簡單的解決方案,請嘗試使用我的解決方案

    String s = "A+B+(C+D+(A+B))+(B+C)";
    List<String> l = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    int p = 0;
    for (char c : s.toCharArray()) {
        if (c == '(') {
            p++;
            sb.append(c);
        } else if (c == ')') {
            p--;
            sb.append(c);
        } else if (p == 0 && c == '+') {
            l.add(sb.toString());
            sb.setLength(0);
        } else {
            sb.append(c);
        }
    }
    if (sb.length() > 0) {
        l.add(sb.toString());
    }
    System.out.println(l);

產量

[A, B, (C+D+(A+B))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM