我有文本文件解析器。 并有类似的记录
1111 SMITH ROBERT J 1900
工作正常,结果是
ID: 1111
LAST NAME: SMITH
FIRST NAME: ROBERT
MIDDLE NAME: J
MONEY: 1900
但是如果中间名为空,则结果为
ID: 1111
LAST NAME: SMITH
FIRST NAME: ROBERT
MIDDLE NAME: 1900
MONEY: 1900
代码:
StringTokenizer st = new StringTokenizer(token);
Client client = new Client();
while(st.hasMoreElements()){
String token2 = st.nextElement().toString();
String[] array = new String[5];
int i = 0;
array[i++] = new String(token2);
String id = array[0];
String lastName = array[1];
String firstName = array[2];
String middleName = array[3];
String money = array[4];
client.add(id);
client.add(lastName);
client.add(firstName);
client.add(middleName);
client.add(money);
}
listResult.add(client);
我该如何修复它?
最佳答案
如果钱有特定的格式(就像我们的例子,它似乎是一个数字),那么你可以回溯:
- 每行读取 N 个值
- 如果 N = 5,则完成
- 如果 N = 4,您可以检查 array[3] 是否为数字,在这种情况下,您可以移动值(例如:array[4] = array[3], array[3] = ""),否则 array[ 4] = 0(“没钱”)。
- 对于 N 的其他值,您必须决定要做什么。
顺便说一下,你的代码味道很糟糕:
String token2 = st.nextElement().toString();
String[] array = new String[4];
int i = 0;
array[i++] = new String(token2);
token2
已经是一个String
,无需调用new String(token2)
。int i = 0; array[i++]
=> 将始终写入相同的值。- 您可以使用 Arrays.fill(array, null) 重用该数组(例如:将第 2 行放在循环之前),从而避免新的对象分配。
- 您应该在 Client 类上调用
setFirstName
、setLastName
等方法,而不是执行看起来像List
但实际上是不是列表
。
关于java - java 文本文件解析器工作不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25723819/