首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 實作類似 String.split 並保留分隔符的演算法修正

     編輯:程式設計綜合問答

原始代碼缺陷


for (int i = 0; i < s1.length(); i++) {
    for (int j = 0; j < s2.length(); j++) {
        if (s1.charAt(i) == s2.charAt(j)) {
            result[t++] = String.valueOf(s1.charAt(i));
        } else if (s1.charAt(i) != s2.charAt(j)) {
            result[t] += String.valueOf(s1.charAt(i)); // 邏輯錯誤:重複累加
        }
    }
}

問題:雙重迴圈導致同一字元被多次比較,非分隔符字元重複累加到同一索引,且分隔符與子字串界限不明。

修正演算法(單次掃描)


public static String[] splitKeepDelim(String src, String delims) {
    List parts = new ArrayList<>();
    StringBuilder token = new StringBuilder();
    for (int i = 0; i < src.length(); i++) {
        char c = src.charAt(i);
        if (delims.indexOf(c) >= 0) {
            if (token.length() > 0) {
                parts.add(token.toString());
                token.setLength(0);
            }
            parts.add(String.valueOf(c)); // 分隔符單獨成段
        } else {
            token.append(c);
        }
    }
    if (token.length() > 0) parts.add(token.toString());
    return parts.toArray(new String[0]);
}

測試


String[] r = splitKeepDelim("hello#world?hello#kitty", "#?");
// 輸出: hello, #, world, ?, hello, #, kitty
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved