编写Java程序来处理字符串中的null域
2012-03-23 01:26
447 查看
编写Java程序来处理字符串中的null域--利用StringTokenizer分解字符串
先看一个场景分析:
import java.util.*;
public class StrTokDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |");
while(st.hasMoreElements())
System.out.println("Token: " + st.nextElement());
}
}
结果:
Token: Hello
Token: World
Token: of
Token: Java
但如果使用这上面的程序读取下面的行:
FirstName|Lastname|Company|PhoneNumber
可能会出现问题,例如有人没有工作,他的Company一栏是空的(即形如:FirstName|Lastname| |PhoneNumber),也就是说两个分隔符(空格和|)在一起,但当你运行这个程序时,却没有输出“额外”的token(标记)。
我可以在构造StringTokenizer对象时增加一个参数True,表示希望将分隔符视为token,但这需要我在做近一步的处理,如下:
import java.util.*;
//使用StringTokenizer类,包括返回分隔符
public class StrTokDemo4 {
public final static int MAXFIELDS = 5;
public final static String DELIM = "|";
//处理一个字符串,返回一个各域组成的数组
public static String[] process(String line){
String[] results = new String[MAXFIELDS];
StringTokenizer st = new StringTokenizer(line, DELIM, true);
int i = 0;
//得到每一个StringTokenizer类
while(st.hasMoreTokens()){
String s = st.nextToken();
if(s.equals(DELIM)){
if(i++ >= MAXFIELDS)
throw new IllegalArgumentException("Input line " + line + " has too many fields");
continue;
}
results[i] = s;
}
return results;
}
public static void printResults(String input, String[] outputs){
System.out.println("Input: " + input);
for(int i = 0; i < outputs.length; i++)
System.out.println("Output " + i + " was: " + outputs[i]);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
printResults("A|B|C|D", process("A|B|C|D"));
printResults("A||C|D", process("A||C|D"));
printResults("A|||D|E", process("A|||D|E"));
}
}
结果:
Input: A|B|C|D
Output 0 was: A
Output 1 was: B
Output 2 was: C
Output 3 was: D
Output 4 was: null
Input: A||C|D
Output 0 was: A
Output 1 was: null
Output 2 was: C
Output 3 was: D
Output 4 was: null
Input: A|||D|E
Output 0 was: A
Output 1 was: null
Output 2 was: null
Output 3 was: D
Output 4 was: E
总结自:《Java经典实例》 O'REILLY 第69页。
先看一个场景分析:
import java.util.*;
public class StrTokDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |");
while(st.hasMoreElements())
System.out.println("Token: " + st.nextElement());
}
}
结果:
Token: Hello
Token: World
Token: of
Token: Java
但如果使用这上面的程序读取下面的行:
FirstName|Lastname|Company|PhoneNumber
可能会出现问题,例如有人没有工作,他的Company一栏是空的(即形如:FirstName|Lastname| |PhoneNumber),也就是说两个分隔符(空格和|)在一起,但当你运行这个程序时,却没有输出“额外”的token(标记)。
我可以在构造StringTokenizer对象时增加一个参数True,表示希望将分隔符视为token,但这需要我在做近一步的处理,如下:
import java.util.*;
//使用StringTokenizer类,包括返回分隔符
public class StrTokDemo4 {
public final static int MAXFIELDS = 5;
public final static String DELIM = "|";
//处理一个字符串,返回一个各域组成的数组
public static String[] process(String line){
String[] results = new String[MAXFIELDS];
StringTokenizer st = new StringTokenizer(line, DELIM, true);
int i = 0;
//得到每一个StringTokenizer类
while(st.hasMoreTokens()){
String s = st.nextToken();
if(s.equals(DELIM)){
if(i++ >= MAXFIELDS)
throw new IllegalArgumentException("Input line " + line + " has too many fields");
continue;
}
results[i] = s;
}
return results;
}
public static void printResults(String input, String[] outputs){
System.out.println("Input: " + input);
for(int i = 0; i < outputs.length; i++)
System.out.println("Output " + i + " was: " + outputs[i]);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
printResults("A|B|C|D", process("A|B|C|D"));
printResults("A||C|D", process("A||C|D"));
printResults("A|||D|E", process("A|||D|E"));
}
}
结果:
Input: A|B|C|D
Output 0 was: A
Output 1 was: B
Output 2 was: C
Output 3 was: D
Output 4 was: null
Input: A||C|D
Output 0 was: A
Output 1 was: null
Output 2 was: C
Output 3 was: D
Output 4 was: null
Input: A|||D|E
Output 0 was: A
Output 1 was: null
Output 2 was: null
Output 3 was: D
Output 4 was: E
总结自:《Java经典实例》 O'REILLY 第69页。
相关文章推荐
- string类的基本使用,编写一个字符串处理程序
- java程序,编写一个方法,输出在一个字符串中,指定字符串输出的次数
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- Java 文件统计:编写程序,统计英文文本文件中的字符数目和单词数目。程序运行时,输入要统计的文件的名称,程序处理后输出字符数目和单词数目
- [编写高质量代码:改善java程序的151个建议]建议71 推荐使用subList处理局部列表
- 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理
- 学习Java中的日期和时间处理及Java日历小程序的编写
- 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理
- java程序,编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数及非英文字母数
- [编写高质量代码:改善java程序的151个建议]建议56:自由选择字符串拼接方法
- 编写0号中断处理程序,使得在出发溢出发生时,在屏幕中间显示字符串,然后返回到DOS
- [编写高质量代码:改善java程序的151个建议]建议57 推荐在复杂字符串操作中使用正则表达式
- 编写Java程序分析字符串中每个单词的个数
- 用java编写一个程序,将浮点数转换成人民币读法字符串
- java编写程序查找出在一个字符串中出现次数最多的字母
- [编写高质量代码:改善java程序的151个建议]建议59 对字符串排序(中文)
- Java中编写交互程序时, 如何处理用户输入错误