前言
在進行JSON資料采集的時候,對于單個節點資料,可能存在多個分隔符分隔資料。那麼對于資料
1,2,3|4,5,6
我們需要依據分隔符的來進行分割切分。有三種方法:
- String.split方法
- StringTokenizer方法
- subString拼接方法
split
存在的問題
split方法本質上是使用正規表達式來進行切割的,是以我們在使用他的時候對于像:
|
這種轉義字元進行切割的時候就出現問題了:
String str = "1|6|9";
System.err.println( Arrays.toString(str.split("|") )) ;
解決方案
1、前端手動處理轉義字元;
2、後端手動處理轉義字元;
後端處理:
//方法一:String.split加HashMap
//
static HashMap<String, String> specialSpliterMap = new HashMap<>();
public static void initSpecialSpliterMap(){
specialSpliterMap.put("|", "\\|");
specialSpliterMap.put(".", "\\.");
specialSpliterMap.put("*", "\\*");
specialSpliterMap.put("+", "\\+");
}
public static void main(String[] args) {
initSpecialSpliterMap();
String str = "1|6|9";
System.err.println( Arrays.toString( str.split( specialSpliterMap.get("|") )) ) ;
}
StringTokenizer
StringTokenizer類是一個較偏僻的曆史留下來的相容類。特點是不支援正規表達式,也就不存在轉義字元的問題,但是本質上是隻支援
單字元分割的
:
String str = "1,2,3|4,5,6|7,8,9";
StringTokenizer st = new StringTokenizer(str , ",,",false);//"|");
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
|分割:
,和,或者,分割:
原因
構造
StringTokenizer(String str, String delimiters)
StringTokenizer(String str, String delimiters, boolean delimitersAreToken)
其中第三個
boolean delimitersAreToken
是是否傳回分隔符也是token,啟用後:
substring
最精确的,就是操作表較繁瑣,效率比上面兩個都要低:
public static List<String> getListByDelimiter(String str , String delimiter) {
int index;
String tempString;
List<String> resList = new LinkedList<>();
while ((index = str.indexOf(delimiter)) >= 0) {
tempString = str.substring(0, index);
if(tempString!=null && !tempString.trim().equals("")) resList.add(tempString);
str = str.substring(index + 1);
if (str.indexOf(delimiter)<0) {
if(str!=null && !str.trim().equals("")) resList.add(str);
}
}
return resList;
}
public static void main(String[] args) {s
for (String s : getListByDelimiter(str, "|")) {
System.out.println(s);
}
}
這個方法會過濾掉空值和空串資料,比如說拼接long,width,high的資料:
"type3": [
{
"long": "1, ,3,4, ",
"width": " ,7, ",
"high": " ,10,11, "
}
]
最終結果:10,11,1,3,4,7
比如說:
輸出:
不過濾資料的
當我們去掉兩個if判斷後:
public static List<String> getListByDelimiter(String str , String delimiter) {
int index;
String tempString;
List<String> resList = new LinkedList<>();
while ((index = str.indexOf(delimiter)) >= 0) {
tempString = str.substring(0, index);
resList.add(tempString);
str = str.substring(index + 1);
if (str.indexOf(delimiter)<0) {
resList.add(str);
}
}
return resList;
}