java替换指定位置的字符串
一、吐槽
? ? 在和安卓部門對接過程中,真的是遇到非常扯淡的問題,我們需要的是一段坐標(biāo)系的參數(shù),安卓定義的圓形的地理坐標(biāo)是 "經(jīng)度 緯度"的形式,也就是說參數(shù)是經(jīng)度+空格+緯度形式,然而到了折線和矩形多邊形時,地理坐標(biāo)卻變成了? ?["經(jīng)度","緯度","經(jīng)度","緯度","經(jīng)度","緯度"]這樣的形式,與我們后端的定義接口有問題,后端是["經(jīng)度 緯度","經(jīng)度 緯度"]形式,由于項目比較急,一下更改安卓參數(shù)來不及了,因此只能含淚更改參數(shù)格式。
? ? 對于老開發(fā)來說,這個規(guī)律其實(shí)挺簡單,就是替換掉奇數(shù)位置的? ?","? 雙冒號加逗號變成空格即可。
? ? 思路是有了,但是怎么處理呢?
? ? 不可能傻傻的去用str.split拆分然后一個一個去判斷吧?這樣極為復(fù)雜,而且還會帶來一些奇奇怪怪的bug
? ? 給你們看一下我們新來的同事寫的代碼:
public StringBuffer editParams(String str) {String repl = "\",\"";String[] strArr = str.replaceAll(repl, " ").split(" ");StringBuffer sub = new StringBuffer();for (int i = 0; i < strArr.length; i++) {if ((i + 1) % 2 == 0 && i + 1 != strArr.length) {sub.append(strArr[i]).append("\",\"");} else {sub.append(strArr[i]).append(" ");}}return sub; }? ? ?這樣的代碼咋一看,確實(shí)是沒有問題,轉(zhuǎn)換后的代碼也符合app到后臺的需求格式,后臺能夠正常解析。
? ? 但是,從后臺到安卓,我又得將所有的空格替換為? ","? 符號!問題就來了,他的代碼不知道咋回事,后面就多了一個空格,導(dǎo)致解析的數(shù)據(jù)會多了一個? "," 符號,會造成安卓解析失敗!他的解決辦法估計又得添加多個條件判斷,誰知道后續(xù)還有沒有坑?
? ? 為了實(shí)現(xiàn)一個簡單思路,添加了這么多的判斷邏輯,在我認(rèn)為這是得不償失的。
二、解決辦法
? ? 我這里只要替換掉奇數(shù)位置的 "," 為空格即可,那么閱讀過String源碼的同學(xué)肯定會第一時間想到正則表達(dá)式,這里不要覺得正則表達(dá)式耗費(fèi)性能哈,String源碼都用了正則表達(dá)式,你還有啥資格在這里BB?
? ? 下面就是我的解決思路,不僅是奇數(shù)位置,偶數(shù)位置,第一個位置等等等,皆可以實(shí)現(xiàn),而且不會多出無用的空格,經(jīng)過對接測試,表現(xiàn)完美。
private String appTransToMap(String string) {int count = 1;String findText = "\",\"";//要替換的符號Pattern p = Pattern.compile(findText);Matcher m = p.matcher(string);//替換的符合與要對比的符號進(jìn)行匹配StringBuffer sb = new StringBuffer();while (m.find()) {count = count + 1;if (count % 2 == 0) {//這里為什么是等于0而不是1呢?因?yàn)槲业腸ount定義就是1而不是0m.appendReplacement(sb," ");//會將替換后的結(jié)果存在sb中}}m.appendTail(sb);//這段代碼必須要添加return sb.toString(); }?
總結(jié)
以上是生活随笔為你收集整理的java替换指定位置的字符串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 邮箱长度_数据库中电子邮件地
- 下一篇: 上期ctp期货API android 客