Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 标记化似乎将分隔符包含在新分隔符后面的标记中_Java_Java.util.scanner_Tokenize_Delimiter - Fatal编程技术网

Java 标记化似乎将分隔符包含在新分隔符后面的标记中

Java 标记化似乎将分隔符包含在新分隔符后面的标记中,java,java.util.scanner,tokenize,delimiter,Java,Java.util.scanner,Tokenize,Delimiter,该程序是一个电话簿应用程序,它接受格式化的用户输入(例如,添加SampleName;SamplePhoneNumber;SampleCategory) 此方法应将其分为四个Strings: “添加”命令 其他3个令牌中的每一个 第一个分隔符是空格,另外两个是。当我使用下面的代码时,出于某种原因,会在SampleName中包含一个空格作为前缀。我不知道为什么会发生这种情况,也不知道如何以实际的方式纠正这种情况。我习惯C++,我只是学习java。如有任何建议,我们将不胜感激 方法如下: publ

该程序是一个电话簿应用程序,它接受格式化的用户输入(例如,
添加SampleName;SamplePhoneNumber;SampleCategory

此方法应将其分为四个
String
s:

  • “添加”命令
  • 其他3个令牌中的每一个
第一个分隔符是空格,另外两个是
。当我使用下面的代码时,出于某种原因,会在
SampleName
中包含一个空格作为前缀。我不知道为什么会发生这种情况,也不知道如何以实际的方式纠正这种情况。我习惯C++,我只是学习java。如有任何建议,我们将不胜感激

方法如下:

public static Vector tokenize(String com)
{
   Scanner scanner = new Scanner(com);

Vector vs = new Vector();
String s;

while(scanner.hasNext())
{
    if(vs.size()==0)
    {
                scanner.useDelimiter("\\p{javaWhitespace}+");
                s = scanner.next();  // Sets the first delimiter to ' '
                scanner.useDelimiter("[;]");
    }
    else
    {
                scanner.useDelimiter("[;]");
                s = scanner.next();  // Sets all other delimiters as ';'
    }
    vs.add(s);  //  Adds the string s to the vector of strings vs
}

return vs;
}

切换分隔符后,似乎会保留额外的空格。通过在整个过程中使用相同的分隔符,您可以很容易地绕过此问题:

public static Vector tokenize(final String com) {
    Scanner scanner = new Scanner(com);
    scanner.useDelimiter("[;\\p{javaWhitespace}]+");
    Vector vs = new Vector();
    while (scanner.hasNext()) {
        vs.add(scanner.next()); // Adds the string to the vector of strings vs
    }
    return vs;
}
还是这个

public static Vector tokenize(final String com) {
    String[] tokens = com.split(" |;");
    Vector<String> vs = new Vector<String>(tokens.length);
    for (String s : tokens) {
            vs.add(s);
    }
    return vs;
}
公共静态向量标记化(最终字符串com){
String[]tokens=com.split(“|”);
向量vs=新向量(令牌长度);
for(字符串s:标记){
vs.add(s);
}
回报vs;
}

您可以始终使用
trim()
,这将删除任何前导或尾随空格(例如
vs.add(s.trim())
)旁注:您应该使用
List vs=Collections.synchronizedList(new ArrayList())而不是
向量
<代码>矢量
已弃用/过时。好的,谢谢。我想我会的。如果有人知道为什么,尽管它似乎包含了带有第二个令牌的预先固定的空格,我有兴趣了解nsee@Keppil的答案。我建议使用
\\s
作为空格,但这只是我自己。回答得好。您可能希望避免使用不推荐使用的类(例如
Vector
)。
列表
会更好。@Xynariz:我同意,但OP使用了一个向量,所以我的回答遵循了他的思路。