• JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换工具类(调优)


    原文链接:http://blog.csdn.net/qq7342272/article/details/6830907#comments

    调试时出现bug,在String中包含list嵌套或map嵌套时会出现字符串下标越界异常,原因是split分割时会出现""字符串,此时引用str.charAt(0)会抛出该异常,如图:

    优化代码,经调试暂时解决String中2层嵌套list转换,如下:

      1 package test;
      2 
      3 import java.util.ArrayList;
      4 import java.util.HashMap;
      5 import java.util.List;
      6 import java.util.Map;
      7 
      8 public class CopyOfStringUtil {
      9 
     10     /**
     11      * 定义分割常量 
     12      * #用于list中每个元素间的分割
     13      * |用于map中每一个kv对间的分割
     14      * =用于map中key与value间的分割
     15      */
     16     private static final String SEP1 = ",";
     17     private static final String SEP2 = "|";
     18     private static final String SEP3 = "=";
     19 
     20     /**
     21      * List转换String
     22      * 
     23      * @param list
     24      *            :需要转换的List
     25      * @return String转换后的字符串
     26      */
     27     public static String ListToString(List<?> list) {
     28         StringBuffer sb = new StringBuffer();
     29         if (list != null && list.size() > 0) {
     30             for (int i = 0; i < list.size(); i++) {
     31                 if (list.get(i) == null || list.get(i) == "") {
     32                     continue;
     33                 }
     34                 // 如果值是list类型则调用自己
     35                 if (list.get(i) instanceof List) {
     36                     sb.append(ListToString((List<?>) list.get(i)));
     37                     sb.append(SEP1);
     38                 } else if (list.get(i) instanceof Map) {
     39                     sb.append(MapToString((Map<?, ?>) list.get(i)));
     40                     sb.append(SEP1);
     41                 } else {
     42                     sb.append(list.get(i));
     43                     sb.append(SEP1);
     44                 }
     45             }
     46         }
     47         return "L" + sb.toString();
     48     }
     49 
     50     /**
     51      * Map转换String
     52      * 
     53      * @param map
     54      *            :需要转换的Map
     55      * @return String转换后的字符串
     56      */
     57     public static String MapToString(Map<?, ?> map) {
     58         StringBuffer sb = new StringBuffer();
     59         // 遍历map
     60         for (Object obj : map.keySet()) {
     61             if (obj == null) {
     62                 continue;
     63             }
     64             Object key = obj;
     65             Object value = map.get(key);
     66             if (value instanceof List<?>) {
     67                 sb.append(key.toString() + SEP1 + ListToString((List<?>) value));
     68                 sb.append(SEP2);
     69             } else if (value instanceof Map<?, ?>) {
     70                 sb.append(key.toString() + SEP1 + MapToString((Map<?, ?>) value));
     71                 sb.append(SEP2);
     72             } else {
     73                 sb.append(key.toString() + SEP3 + value.toString());
     74                 sb.append(SEP2);
     75             }
     76         }
     77         return "M" + sb.toString();
     78     }
     79 
     80     /**
     81      * String转换Map
     82      * 
     83      * @param mapText
     84      *            :需要转换的字符串
     85      * @return Map<?,?>
     86      */
     87     public static Map<String, Object> StringToMap(String mapText) {
     88 
     89         if (mapText == null || mapText.equals("")) {
     90             return null;
     91         }
     92         mapText = mapText.substring(1);
     93 
     94         Map<String, Object> map = new HashMap<String, Object>();
     95         String[] text = mapText.split("\" + SEP2); // 转换为数组
     96         for (String str : text) {
     97             String[] keyText = str.split(SEP3); // 转换key与value的数组
     98             if (keyText.length < 1) {
     99                 continue;
    100             }
    101             String key = keyText[0]; // key
    102             String value = keyText[1]; // value
    103             if (value.charAt(0) == 'M') {
    104                 Map<?, ?> map1 = StringToMap(value);
    105                 map.put(key, map1);
    106             } else if (value.charAt(0) == 'L') {
    107                 List<?> list = StringToList(value);
    108                 map.put(key, list);
    109             } else {
    110                 map.put(key, value);
    111             }
    112         }
    113         return map;
    114     }
    115 
    116     /**
    117      * String转换List
    118      * 
    119      * @param listText
    120      *            :需要转换的文本
    121      * @return List<?>
    122      */
    123     public static List<Object> StringToList(String listText) {
    124         if (listText == null || listText.equals("")) {
    125             return null;
    126         }
    127         listText = listText.substring(1);
    128 
    129         List<Object> list = new ArrayList<Object>();
    130         String[] text = listText.split("\" + SEP1);
    131         String listStr = "";
    132         boolean flag = false;
    133         for (String str : text) {
    134             if (!str.equals("")) {
    135                 if (str.charAt(0) == 'M') {
    136                     Map<?, ?> map = StringToMap(str);
    137                     list.add(map);
    138                 } else if (str.charAt(0) == 'L' || flag) {
    139                     flag = true;
    140                     listStr += str + SEP1;
    141                 } else {
    142                     list.add(str);
    143                 }
    144             }
    145             if (str.equals("")) {
    146                 flag = false;
    147                 List<?> lists = StringToList(listStr);
    148                 list.add(lists);
    149             }
    150         }
    151         return list;
    152     }
    153 
    154 }

    测试代码如下:

     1 package test;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.List;
     6 import java.util.Map;
     7 
     8 public class StringUtilTest {
     9 
    10     List<Object> list = new ArrayList<Object>();//外层list
    11     List<Object> innerList = new ArrayList<Object>();//内层嵌套list
    12     Map<String, Object> map = new HashMap<String, Object>();
    13     String listText, mapText;
    14 
    15     /**
    16      * 测试数据初始化
    17      */
    18     public StringUtilTest() {
    19         innerList.add("innerlist1");
    20         innerList.add("innerlist2");
    21         list.add(innerList);
    22         list.add("out1");
    23         list.add("out2");
    24 
    25         map.put("innermap1", "v1");
    26         map.put("innermap2", "v2");
    27 
    28         listText = "LLinnerlist1,innerlist2,,out1,out2,";//list字符串源
    29 
    30         mapText = "Minnermap2=v2|innermap1=v1|";//map字符串源
    31     }
    32 
    33     public static void main(String[] args) {
    34         StringUtilTest test = new StringUtilTest();
    35 
    36         String ls = test.testListToString();
    37         System.out.println(ls);
    38 
    39         String ms = test.testMapToString();
    40         System.out.println(ms);
    41 
    42         List<?> list = test.testStringToList();
    43         System.out.println(list);
    44 
    45         Map<?, ?> map = test.testStringToMap();
    46         System.out.println(map);
    47     }
    48 
    49     public String testListToString() {
    50         return CopyOfStringUtil.ListToString(list);
    51     }
    52 
    53     public String testMapToString() {
    54         return CopyOfStringUtil.MapToString(map);
    55     }
    56 
    57     public List<?> testStringToList() {
    58         return CopyOfStringUtil.StringToList(listText);
    59     }
    60 
    61     public Map<?, ?> testStringToMap() {
    62         return CopyOfStringUtil.StringToMap(mapText);
    63     }
    64 
    65 }

    测试结果,满足2层嵌套list:

  • 相关阅读:
    代码题(22)— 二叉树镜像、相同的树 、对称二叉树
    代码题(26)— 不同路径
    代码题(25)— 最大子序和、最长上升子序列
    Linux 基本命令总结
    C++(五)— 控制保留小数位数
    C++(四)— 字符串、数字翻转3种方法
    代码题(24)— 寻找重复数、数组中重复的数据、找到所有数组中消失的数字
    代码题(23)— 数组中的最长山脉
    【vue】vue +element 搭建项目,将js函数变成vue的函数
    【vue】vue +element 搭建项目,$createElement使用
  • 原文地址:https://www.cnblogs.com/cn-wxw/p/6684280.html
Copyright © 2020-2023  润新知