java - java 文本文件解析器工作不正确

标签 java parsing

我有文本文件解析器。 并有类似的记录

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);
  1. token2 已经是一个 String,无需调用 new String(token2)
  2. int i = 0; array[i++] => 将始终写入相同的值。
  3. 您可以使用 Arrays.fill(array, null) 重用该数组(例如:将第 2 行放在循环之前),从而避免新的对象分配。
  4. 您应该在 Client 类上调用 setFirstNamesetLastName 等方法,而不是执行看起来像 List 但实际上是不是列表

关于java - java 文本文件解析器工作不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25723819/

相关文章:

java - 当文件夹中没有文件时 Camel 停止

java - SpringMVC : @PathVariable value containing the plus (+) character

java - 如何在JOOQ中清除批处理?

parsing - 将 Mathematica 移植到 Octave

使用 R 读取和转换二进制原始数据

java - 无法从流中读取(IOException : non-blocking socket would block) using Bouncy CaSTLe with Xamarin and Java Server

java - 安卓工作室 : Github commit warning - Access can be package-private

c# - 从 C# 打印堆栈跟踪信息

linux - 如何解析我想在 shell 命令中提取的单词?

regex - 什么是上下文无关语法?