问题
java String类型对象转换为自定义类型对象
详细问题
对于java自定义类型对象提供了toString()方法,实现自定义类型对象转换为String类型对象,如何将String类型对象转换为自定义类型对象,譬如对于如下代码所定义的Class类
package com.iflytek.bms.domain;
import java.math.BigDecimal;
import java.sql.Timestamp;
public class Class {
private Integer integer;
private Double aDouble;
private String string;
private Timestamp timestamp;
private BigDecimal bigDecimal;
public Integer getInteger() {
return integer;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
public Double getaDouble() {
return aDouble;
}
public void setaDouble(Double aDouble) {
this.aDouble = aDouble;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public Timestamp getTimestamp() {
return timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public BigDecimal getBigDecimal() {
return bigDecimal;
}
public void setBigDecimal(BigDecimal bigDecimal) {
this.bigDecimal = bigDecimal;
}
@Override
public String toString() {
return "Class{" +
"integer=" + integer +
", aDouble=" + aDouble +
", string='" + string + '\'' +
", timestamp=" + timestamp +
", bigDecimal=" + bigDecimal +
'}';
}
}
解决方案
package com.iflytek.bms.domain;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Class {
private Integer integer;
private Double aDouble;
private String string;
private Timestamp timestamp;
private BigDecimal bigDecimal;
public Integer getInteger() {
return integer;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
public Double getaDouble() {
return aDouble;
}
public void setaDouble(Double aDouble) {
this.aDouble = aDouble;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public Timestamp getTimestamp() {
return timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public BigDecimal getBigDecimal() {
return bigDecimal;
}
public void setBigDecimal(BigDecimal bigDecimal) {
this.bigDecimal = bigDecimal;
}
@Override
public String toString() {
return "Class{" +
"integer=" + integer +
", aDouble=" + aDouble +
", string='" + string + '\'' +
", timestamp=" + timestamp +
", bigDecimal=" + bigDecimal +
'}';
}
public static Class fromString(String str) {
Class obj = new Class();
Pattern pattern = Pattern.compile("Class\\{integer=(\\d+), aDouble=(\\d+\\.\\d+), string='(.*?)', timestamp=(.*?), bigDecimal=(\\d+\\.\\d+)\\}");
Matcher matcher = pattern.matcher(str);
if (matcher.matches()) {
obj.setInteger(Integer.parseInt(matcher.group(1)));
obj.setaDouble(Double.parseDouble(matcher.group(2)));
obj.setString(matcher.group(3));
obj.setTimestamp(Timestamp.valueOf(matcher.group(4)));
obj.setBigDecimal(new BigDecimal(matcher.group(5)));
}
return obj;
}
}
解决原因
笔者使用正则表达式和Java的Matcher类来实现从字符串到自定义类对象的转换,下面笔者将对fromString方法进行详细解析
1、创建一个新的Class对象:
Class obj = new Class();
作用:创建一个新的Class对象,用于存储从字符串中解析的属性值。
2、编译正则表达式并创建Pattern对象:
Pattern pattern = Pattern.compile("Class\\{integer=(\\d+), aDouble=(\\d+\\.\\d+), string='(.*?)', timestamp=(.*?), bigDecimal=(\\d+\\.\\d+)\\}");
使用正则表达式"Class\{integer=(\d+), aDouble=(\d+\.\d+), string='(.?)', timestamp=(.?), bigDecimal=(\d+\.\d+)\}"编译创建一个Pattern对象,用于匹配包含Class对象属性的字符串。
3、创建Matcher对象并进行匹配:
Matcher matcher = pattern.matcher(str);
if (matcher.matches()) {
// 执行属性值的提取和设置
}
作用:使用创建的Pattern对象对输入的字符串str进行匹配,然后通过matcher.matches()方法判断是否匹配成功。
4、提取并设置属性值:
obj.setInteger(Integer.parseInt(matcher.group(1)));
obj.setaDouble(Double.parseDouble(matcher.group(2)));
obj.setString(matcher.group(3));
obj.setTimestamp(Timestamp.valueOf(matcher.group(4)));
obj.setBigDecimal(new BigDecimal(matcher.group(5)));
作用:如果匹配成功,通过matcher.group()方法提取匹配到的属性值,并将其转换为相应的类型(如整数、双精度浮点数、字符串等),然后使用对应的set方法将属性值设置到Class对象中。
5、返回解析后的Class对象:
eturn obj;
作用:返回经过解析后的Class对象。
请注意,在使用这段代码时,确保输入的字符串与正则表达式的格式匹配,并且属性值的类型与代码中的设置相匹配。如果输入的字符串不符合预期的格式,或者属性值的类型转换失败,可能会导致运行时异常。
参考文献
chatgpt
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈