Java 解析数据字符串的正确方法
我对编程相当陌生,最近我构建了一个Android应用程序,可以使用USB OTG从USB串行设备读取数据。我将数据读入字节缓冲区,将其转换为字符串,然后解析字符串,这样我就可以选择并使用数据的不同部分在我的应用程序上显示不同的内容Java 解析数据字符串的正确方法,java,string,oop,parsing,performance,Java,String,Oop,Parsing,Performance,我对编程相当陌生,最近我构建了一个Android应用程序,可以使用USB OTG从USB串行设备读取数据。我将数据读入字节缓冲区,将其转换为字符串,然后解析字符串,这样我就可以选择并使用数据的不同部分在我的应用程序上显示不同的内容我首先使用example.substring(example.lastIndexOf(“123”)来实现这一点要将字符串拆分并丢失我不需要的字符串的第一部分,我需要检查子字符串的长度以确保数据正确,接下来我将子字符串数据转换为字符数组,以便能够选择数组中的不同数据元素
我首先使用
example.substring(example.lastIndexOf(“123”)来实现这一点
要将字符串拆分并丢失我不需要的字符串的第一部分,我需要检查子字符串的长度以确保数据正确,接下来我将子字符串数据转换为字符数组,以便能够选择数组中的不同数据元素并在屏幕上显示它们。这似乎可行,但我只是觉得解析字符串的方法混乱而且可能不正确。有人能告诉我是否有更有效的方法来解析字符串,或者我是否应该使用当前的方法。
例如:
String s = "Serial Data String TX, ID: 1, UOD: 1234, OK";
String ss = s.substring(s.lastIndexOf("ID: "));
int len = ss.length();
char[] c = ss.toCharArray();
if (len == 20) {
if (c[4] == '1') {
String mSubstring = ss.substring(12, 16);
tv1.setText(mSubString);
这是一种混乱/无效的方法吗?您可以使用子字符串直接比较,而不是将字符串转换为字符数组:
if (len == 20 && "1".equals(ss.substring(4, 1)) {
String mSubstring = ss.substring(12, 16);
tv1.setText(mSubString);
}
或者在ID:
之后启动子字符串,并使用startsWith()
:
您可以使用子字符串并直接比较,而不是将字符串转换为字符数组:
if (len == 20 && "1".equals(ss.substring(4, 1)) {
String mSubstring = ss.substring(12, 16);
tv1.setText(mSubString);
}
或者在ID:
之后启动子字符串,并使用startsWith()
:
实际上,有很多种方法可以设计它,在这里我将告诉你哪种看起来最好,同时也不会太复杂 首先创建一个类,该类将保存串行数据属性,如ID、UOD等
然后,因为您已经有了像“,”这样的分隔符和像“:”这样的内部分隔符,使用它们进行拆分并使用修剪以获得实际结果,尝试使其通用化,以便将来的新属性能够以最小的更改进行调整。如果您希望对此进行代码级别的解释,请告诉我。实际上,您可以用各种方法来设计它,在这里,我将告诉您哪种方法看起来最好,同时ime不是太复杂的方法 首先创建一个类,该类将保存串行数据属性,如ID、UOD等
然后,因为您已经有了像“,”这样的分隔符和像“:”这样的内部分隔符,使用它们进行拆分并使用trim来获得实际结果,尝试将其通用化,以便将来的新属性能够以最小的更改进行调整。如果您希望对此进行代码级解释,请告诉我。好的,这是一种方法,尽管容易出现位错误/异常。例如
s.substring(s.lastIndexOf("ID: "));
可能导致索引自动边界异常
,因为可能返回-1
。您必须检查并做出相应反应
此外,使用固定长度和索引也可能导致错误,最好是动态确定这些错误
我会用另一种方法,将原始字符串拆分成更小的部分,然后对它们进行解析
String s = "Serial Data String TX, ID: 1, UOD: 1234, OK";
似乎可以通过,
进行拆分,因此在第一步中执行s.split(“,”)
,将产生以下子字符串
String[] subs = {"Serial Data String TX", "ID: 1", "UOD: 1234", "OK"};
在第二步中,您可以将其拆分为一个空格,例如第一个数组中的第二个元素
subs[1].split(": ")
将导致
String[] subs2 = {"ID", "1"}
等等
在尝试访问元素之前,不要忘记检查元素是否存在
更新
下面是使用上述方法的一个可能实现
public void testSplit() {
String s = "Serial Data String TX, ID: 1, UOD: 1234, OK";
String[] subs = s.split("\\s*,\\s*");
String id = "not available";
String uod = "not available";
if(subs.length > 1) {
String[] subsId = subs[1].split("\\s*:\\s*");
if("ID".equals(subsId[0]) && subsId.length > 1) {
id = subsId[1];
}
}
if(subs.length > 2) {
String[] subsUod = subs[2].split("\\s*:\\s*");
if("UOD".equals(subsUod[0]) && subsUod.length > 1) {
uod = subsUod[1];
}
}
System.out.printf("ID=%s%nUOD=%s%n", id, uod);
}
输出为
ID=1
UOD=1234
如果您不确切知道
ID
和UOD
在原始字符串中的位置,那么您可能希望循环第一次拆分的结果,并对每个字符串进行第二次拆分,然后检查索引0
处的元素是否是您要查找的元素之一,如果是,则检查索引1,如果是,则取该值,其他方面无值可用。好的,这是一种方法,尽管容易发生位错误/异常。例如
s.substring(s.lastIndexOf("ID: "));
可能导致索引自动边界异常
,因为可能返回-1
。您必须检查并做出相应反应
此外,使用固定长度和索引也可能导致错误,最好是动态确定这些错误
我会用另一种方法,将原始字符串拆分成更小的部分,然后对它们进行解析
String s = "Serial Data String TX, ID: 1, UOD: 1234, OK";
似乎可以通过,
进行拆分,因此在第一步中执行s.split(“,”)
,将产生以下子字符串
String[] subs = {"Serial Data String TX", "ID: 1", "UOD: 1234", "OK"};
在第二步中,您可以将其拆分为一个空格,例如第一个数组中的第二个元素
subs[1].split(": ")
将导致
String[] subs2 = {"ID", "1"}
等等
在尝试访问元素之前,不要忘记检查元素是否存在
更新
下面是使用上述方法的一个可能实现
public void testSplit() {
String s = "Serial Data String TX, ID: 1, UOD: 1234, OK";
String[] subs = s.split("\\s*,\\s*");
String id = "not available";
String uod = "not available";
if(subs.length > 1) {
String[] subsId = subs[1].split("\\s*:\\s*");
if("ID".equals(subsId[0]) && subsId.length > 1) {
id = subsId[1];
}
}
if(subs.length > 2) {
String[] subsUod = subs[2].split("\\s*:\\s*");
if("UOD".equals(subsUod[0]) && subsUod.length > 1) {
uod = subsUod[1];
}
}
System.out.printf("ID=%s%nUOD=%s%n", id, uod);
}
输出为
ID=1
UOD=1234
如果您不确切知道ID
和UOD
在原始字符串中的位置,那么您可能希望循环第一次拆分的结果,并对每个字符串进行第二次拆分,然后检查索引0
处的元素是否是您要查找的元素之一,如果是,则检查索引1,如果是,则取该值,否则无值可用。您可以使用正则表达式:
String s=“串行数据字符串发送,ID:1,UOD:1234,正常”;
模式p=模式。编译(“ID:(\\d+),UOD:(\\d+,(\\w+));
匹配器m=匹配器p;
if(m.find()){
System.out.println(“ID:+m.group(1));
系统输出打印项次(“UOD:+m.group(2));
System.out.println(“状态:+m.group(3));
}
这将表明:
ID:1
计量单位:1234
状态:OK
您可以使用正则表达式:
String s=“串行数据字符串发送,ID:1,UOD:1234,正常”;
模式p=模式。编译(“ID:(\\d+),UOD:(\\d+,(\\w+));
匹配器m=匹配器p;
if(m.find()){
System.out.println(“I