简体   繁体   English

java StringTokenizer意外结果

[英]java StringTokenizer unexpected results

i have the following code which will tokenize the string to create list of Objects: 我有以下代码将标记字符串以创建对象列表:

import java.util.StringTokenizer;


public class TestStringTokenizer {
    private final static String INTERNAL_DELIMETER = "#,#";
    private final static String EXTERNAL_DELIMETER = "#|#";
    public static void main(String[]aregs){
        String test= "1#,#Jon#,#176#|#2#,#Jack#,#200#|#3#,#Jimmy#,#160";
        StringTokenizer tokenizer = new StringTokenizer(test, EXTERNAL_DELIMETER);
        while(tokenizer.hasMoreElements()){
            System.out.println(tokenizer.nextElement());
            //later will take this token and extract elements
        }
    }
}

What i expected output was 我期望的输出是什么
1#,#Jon#,#176 1#,#乔恩#,#176
2#,#Jack#,#200 2#,##杰克,#200
3#,#Jimmy#,#160 3#,麦#,#160

What i got was : 1 我得到的是 :1
,
Jon 乔恩
,
176 176
2 2
,
Jack 插口
,
200 200
3 3
,
Jimmy 吉米
,
160 160

if i change the internal delimeter to some thing like , it will work properly why is this behavior happening ? 如果我将内部分隔符改为某些东西它会正常工作为什么会发生这种情况?

AccordIng to the StringTokenizer JavaDocs AccordIng到StringTokenizer JavaDocs

http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。 It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead. 建议任何寻求此功能的人都使用String的split方法或java.util.regex包。

Use String.split instead: 请改用String.split:

String[] strArr = stringToSplit.split(INTERNAL_DELIMETER);

The only change you need to make is that the or-pipe ("|") in EXTERNAL_DELIMETER is a special regular expression character, and must be escaped: "\\\\|". 您需要做的唯一更改是EXTERNAL_DELIMETER中的or-pipe(“|”)是一个特殊的正则表达式字符,必须进行转义:“\\\\ |”。

More information can be found in the String.split Javadoc: 可以在String.split Javadoc中找到更多信息:

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

StrinTokenizer can't work with expression as a delimiter, try Scanner instead StrinTokenizer无法使用表达式作为分隔符,请尝试使用Scanner

    Scanner sc = new Scanner(test);
    sc.useDelimiter("#\\|#");
    while (sc.hasNext()) {
        System.out.println(sc.next());
    }

StrinTokenizer constructor's second parameter is delimiters(Each character is a delimiter) StrinTokenizer构造函数的第二个参数是分隔符(每个字符都是分隔符)

You can use String.split instead 您可以使用String.split

public class TestStringTokenizer {
    private final static String INTERNAL_DELIMETER = "#,#";
    private final static String EXTERNAL_DELIMETER = "#|#";
    public static void main(String[]aregs){
        String test= "1#,#Jon#,#176#|#2#,#Jack#,#200#|#3#,#Jimmy#,#160";
        for (String s : test.split("#\\|#"))
            System.out.println(s);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM