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:

时间: 2024-10-27 03:31:02

JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换工具类(调优)的相关文章

深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina

Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ public static String StringToAsciiString(String content) { String result = ""; int max = content.length(); for (int i = 0; i < max; i++) { char c

python中2进制、10进制、16进制等之间的转换

10转2: bin(8) # '0b1000' 2转10: int('1000', 2) # 8 10转16: hex(15) # '0xf' 16转10: int('f', 16) # 15 2进制和16进制中间通过转10进制可以相互转换

【转】Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码

原文网址:http://blog.csdn.net/caijunjun1006/article/details/11740223 Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)

Java中char和String的相互转换

转自:http://blog.csdn.net/yaokai_assultmaster/article/details/52082763 Java中char是一个基本类型,而String是一个引用类型.有时候我们需要在它们之间互相转换. String转换为char 在Java中将String转换为char是非常简单的. 1. 使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char. 2. 使用String.toCharArray()(返回值为

java中String和StringBuffer哪个效率高

大多数的网站以及多数的java书上都会说使用StringBuffer类进行字符串"连接"操作是比String类进行连接操作的效率高的,那么真的是这样吗?在这里我们实际自己测试一下,看看他们两个到底谁的效率高,然后从反编译的代码解释原因. 在我的这篇博客:<Java中 "abc" + '/'和"abc" + "/"的区别>中提到了String类的'+'操作是依赖于StringBuilder类的,而JDK API文档中

(转)java 中unsigned类型的转换

转自:http://blog.sina.com.cn/s/blog_77bf45a90101dld9.html 在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取. Java在这方面提供了支持,可以用java.io.DataInputStream 类对象来完成对流内数据的Unsigned读取,该类提供了如下方法: 

Java基础——数据类型之间的转换

Java数据类型分为三大类,即布尔型.字符型和数值型.其中数值型又分为整型和浮点型.Java的基本数据类型(8种)为布尔型boolean(1字节):字符型char(2字节):整型byte(1字节).short(2字节).int(4字节).long(8字节):浮点型float(4字节).double(8字节).此外,编程时还经常用到两种类变量,String和Date. Java数据类型的转换一般分三种,分别是:简单数据类型之间的转换.字符串与其他数据类型的转换.其他实用数据类型的转换. 简单数据类

Java中对整数格式化

Java中对整数格式化 1.说明    对整数进行格式化:%[index$][标识][最小宽度]转换方式 2.实例分析 (1)源码 /** * 1. 对整数进行格式化:%[index$][标识][最小宽度]转换方式 * 2. 对浮点数进行格式化:%[index$][标识][最少宽度][.精度]转换方式 * 3. 对字符进行格式化:对字符进行格式化是非常简单的,c表示字符,标识中'-'表示左对齐 * 4. 对百分比符号进行格式化: */ package com.you.model; /** * @

Java中代码点与代码单元(转)

摘要 本文介绍 Java 平台支持增补字符的方式.增补字符是 Unicode 标准中代码点超出 U+FFFF 的字符,因此它们无法在 Java 编程语言中描述为单个的 16 位实体(例如char数据类型).这些字符一般极少用,但是,有些会在诸如中文或日文人名中用到,因此,在东亚国家,政府应用程序通常会要求支持这些字符. Java 平台目前正在改进,以便支持对增补字符的处理,这种改进对现有的应用程序影响微乎其微.新的低层 API 在需要时能够使用单个的字符运行.不过,大多数文本处理 API 均使用