亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將帶括號的逗號分隔字符串傳遞給列表

將帶括號的逗號分隔字符串傳遞給列表

DIEA 2023-10-13 09:57:57
該方法必須接收Stringin 格式"[1,2,3,4,5]",其中僅包含整數,但它也可以包含"[1,2,3,[]]"or "[1,2,3,[1,2,3]]"。我已經有了將數字添加到列表中的代碼,但我不知道當我List里面有另一個數字時如何處理。我想過有一個類List,當我在里面找到另一個括號再次調用該函數時,但當我看到另一個左括號時不知道如何正確地進行子字符串化[。刪除括號后,我將字符串分割如下:String[] arr = string.split(",");并開始將這些結果添加到List我必須返回 a for loop,我的問題是當我再次看到左括號時,[我必須String再次使用結果子串并調用我的方法,但不知道如何確定右括號。我嘗試過的是獲取右括號的索引indexOf:String aux = arr[i]; int closingBracket = aux.indexOf("]");[1,2,3,4,[,6]但如果我有一個不應該被接受的輸入字符串,它會接受它。
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

您需要做的是在紙上弄清楚什么是有限狀態機 (FSM)。當你遇到一個標記(逗號、括號、數字)時,你就進入了一個特定的狀態。一旦處于某種狀態,您只能接受某些其他令牌,這可能會使您處于不同的狀態或使您處于當前狀態。您可以有許多不同的狀態,它們可以接受不同的令牌并執行不同的操作。


例如。


當您看到一個數字時,下一個標記可能是。


 1.  Another digit

 2.  A closing bracket.

 3.  A comma.

這些令牌中的每一個都可以提示不同的狀態和/或動作。


 1. Another digit - keep on processing since numbers have many digits.

 2. closing bracket - save the number in a list and get the next list (See below)

 3. comma - save the number and look for next number

假設您想將所有這些保存在列表列表中,最簡單的方法是從 a 開始,List<Object>因為您可以將integers和保存lists of lists在具有無限深度的那種類型的列表中。


我還建議你看看Stack class。隨著解析深度的變化,您可能希望推送當前列表并彈出最近的列表。


最后,確保您的括號與以下內容正確匹配。當您看到“[”時增加計數器,當您看到“]”時減少計數器。如果計數器變為負數,則說明右括號過多。如果最后它是正數,則說明您沒有足夠的右括號。


有關這方面的更多信息,請查看維基百科上的有限狀態機。


我決定用一個小例子來說明我正在談論的內容。它可能無法涵蓋所有可能的邊緣情況,但其目的是說明性的。


   public static void main(String[] args) {

      String strlist =

            "[1,2,113],     [4,5,[5,2,10],1], [],[1,2,3,4,5,[10,11,12,13,[14,15]]]";

      int bracketCount = 0;

      int num = 0;


      // inital list

      List<Object> list = new ArrayList<>();


      // hold sublists for precessing

      Stack<List<Object>> stack = new Stack<>();


      char[] chars = strlist.toCharArray();

      for (int i = 0; i < chars.length; i++) {

         char c = chars[i];

         switch (c) {

            // state1 left bracket - push current list on stack for later

            // retrieval

            // allocate new list and add it to one just pushed (remember,

            // I still have its reference).

            // Assign nlist to list

            // increment bracket count

            case '[':

               stack.push(list);

               List<Object> nlist = new ArrayList<>();

               list.add(nlist);

               list = nlist;

               bracketCount++;

               break;

            // state2 right bracket - Finished processing current sublist.

            // if previous tokens were not brackets, then add the

            // number to the list and pop off the previous one.

            // decrement bracket count

            case ']':

               if (chars[i - 1] != '[' && chars[i - 1] != ']') {

                  list.add(num);

               }

               list = stack.pop();

               bracketCount--;

               break;

            // state3 - whitespace - ignore

            case ' ':

            case '\t':

               break;

            // state4 comma - if previous token was not a right bracket,

            // then add number. Reset num for next number.

            case ',':

               if (chars[i - 1] != ']') {

                  list.add(num);

               }

               num = 0;

               break;

            // state5 digit - assumed to be a digit. Each time a digit

            // is encountered, update the number

            default:

               num = num * 10 + c - '0';

         }

         if (bracketCount < 0) {

            System.out.println("too many ] brackets at location " + i);

         }

      }

      if (bracketCount > 0) {

         System.out.println("insufficent number of ] brackets");

      }

      System.out.println(list);

   }

}


請注意,在上面的示例中,“狀態”實際上是“偽狀態”。也就是說,您不需要檢查當前所處的狀態來確定如何處理當前令牌或標記錯誤。


查看完整回答
反對 回復 2023-10-13
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號