当前位置: 代码迷 >> 综合 >> 字符串三种方式切割:split、substring、StringTokenizer
  详细解决方案

字符串三种方式切割:split、substring、StringTokenizer

热度:13   发布时间:2023-11-07 06:03:46.0

前言

在进行JSON数据采集的时候,对于单个节点数据,可能存在多个分隔符分隔数据。那么对于数据1,2,3|4,5,6我们需要依据分隔符的来进行分割切分。有三种方法:

  1. String.split方法
  2. StringTokenizer方法
  3. 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 + delimiter.length());if (str.indexOf(delimiter)<0) {
    if(str!=null && !str.trim().equals(""))	resList.add(str);}}return resList;
}public static void main(String[] args) {
    sfor (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

比如说:

String str = "1,2,3,, ,6";

输出:

在这里插入图片描述

不过滤数据的

当我们去掉两个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 + delimiter.length());if (str.indexOf(delimiter)<0) {
    resList.add(str);}}return resList;
}

在这里插入图片描述

  相关解决方案