您好,登錄后才能下訂單哦!
這篇文章主要介紹“java字符串替換如何實(shí)現(xiàn)”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“java字符串替換如何實(shí)現(xiàn)”文章能幫助大家解決問(wèn)題。
字符串處理在程序猿日常工作工作中非常常見(jiàn),常見(jiàn)到幾乎各種語(yǔ)言中都已經(jīng)封裝好了字符串相關(guān)的API,我們只需要直接拿過(guò)來(lái)用就好。就拿Java為例,jdk中的String()類幾乎封裝了所有字符串相關(guān)的操作,其方法數(shù)量有近百個(gè),幾乎滿足了程序猿所有字符串相關(guān)的操作。
正是因?yàn)檫@么方便,估計(jì)大多數(shù)Java程序猿都沒(méi)自己實(shí)現(xiàn)過(guò)字符串的replace。這里正式引入一下今天的精選面試題:不依賴第三方庫(kù) 實(shí)現(xiàn)一個(gè)字符串替換replace(String str, String target, String replacement)
函數(shù),其功能是將str中所有的target替換為replacement。 其實(shí)這道題并不涉及任何復(fù)雜或者高深的算法,只需要掌握基本的編程就可以做,但當(dāng)我某次把這道題拿出來(lái)面試某個(gè)應(yīng)屆生時(shí),他代碼寫(xiě)的磕磕絆絆的,后來(lái)我也陸陸續(xù)續(xù)用這題考過(guò)好幾個(gè)人,鮮有順暢寫(xiě)出來(lái)的,是我低估了這道題的難度??
回到題目本身,我多說(shuō)兩句,仔細(xì)想想這道題其實(shí)也很簡(jiǎn)單,然而這就難倒了一大批人,大家刷面試題前還是要先打好編程基礎(chǔ)。 這題的解題思路也很簡(jiǎn)單,我們新建個(gè)StringBuilder,只需要把str中不是target的部分加進(jìn)去,如果是遇到target,就把replacement字符串加進(jìn)去,真的沒(méi)有任何復(fù)雜的算法 就是單純考你編程的基本功,代碼如下。
public static String replace(String str, String target, String replacement) { // 正常這里需要對(duì)str,target,replacement做輸入校驗(yàn),這里我省略, 比如str比target端的時(shí)候可以直接返回空字符串 StringBuilder res = new StringBuilder(); for (int i = 0; i < str.length(); ) { if (isMatch(str, i, target)) { i += target.length(); // 如果匹配,需要直接向前跳target.length res.append(replacement); continue; } res.append(str.charAt(i++)); } return res.toString(); } // 單純確認(rèn)從str的pos位置開(kāi)始,是否和target相匹配 private static boolean isMatch(String str, int pos, String target) { for (int i = 0; i < target.length() && i + pos < str.length(); i++) { if (str.charAt(i + pos) != target.charAt(i)) { return false; } } return true; }
看吧,代碼其實(shí)沒(méi)啥難度,但咋就好多明顯刷過(guò)其他面試題的人都不會(huì)呢?。?!
估計(jì)大多數(shù)人都沒(méi)看過(guò)Jdk中的實(shí)現(xiàn),所以順帶我們來(lái)欣賞下java String類中的replace方法是如何實(shí)現(xiàn)的。
public String replace(CharSequence target, CharSequence replacement) { String tgtStr = target.toString(); String replStr = replacement.toString(); int j = indexOf(tgtStr); if (j < 0) { return this; } int tgtLen = tgtStr.length(); int tgtLen1 = Math.max(tgtLen, 1); int thisLen = length(); int newLenHint = thisLen - tgtLen + replStr.length(); if (newLenHint < 0) { throw new OutOfMemoryError(); } StringBuilder sb = new StringBuilder(newLenHint); int i = 0; do { sb.append(this, i, j).append(replStr); // 先把未匹配字符添加進(jìn)去,然后直接添加replStr i = j + tgtLen; } while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0); // 找到下一個(gè)匹配的下標(biāo) return sb.append(this, i, thisLen).toString(); }
jdk中的思路和我們上面寫(xiě)的思路是一致的,但jdk的代碼更為精簡(jiǎn),其實(shí)jdk也沒(méi)用啥高深的東西,只是在indexOf()中考慮了更多數(shù)據(jù)編碼的問(wèn)題。
關(guān)于“java字符串替換如何實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。