第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

1 回答

?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗 獲得超10個贊

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


例如。


當(dāng)您看到一個數(shù)字時,下一個標(biāo)記可能是。


 1.  Another digit

 2.  A closing bracket.

 3.  A comma.

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


 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

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


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


最后,確保您的括號與以下內(nèi)容正確匹配。當(dāng)您看到“[”時增加計數(shù)器,當(dāng)您看到“]”時減少計數(shù)器。如果計數(shù)器變?yōu)樨?fù)數(shù),則說明右括號過多。如果最后它是正數(shù),則說明您沒有足夠的右括號。


有關(guān)這方面的更多信息,請查看維基百科上的有限狀態(tài)機(jī)。


我決定用一個小例子來說明我正在談?wù)摰膬?nèi)容。它可能無法涵蓋所有可能的邊緣情況,但其目的是說明性的。


   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);

   }

}


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


查看完整回答
反對 回復(fù) 2023-10-13
  • 1 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號