1

我正在使用 jdk 1.6(它较旧但还可以)。我有这样的功能:

public static ArrayList gettokens(String input, String delim)
  {
    ArrayList tokenArray = new ArrayList();
    StringTokenizer tokens = new StringTokenizer(input, delim);
    while (tokens.hasMoreTokens())
    {
      tokenArray.add(tokens.nextToken());
    }
    return tokenArray;
  }

我最初的意图是使用令牌来清除重复电子邮件的输入字符串(即初始)。

假设我有

input = ", email-1@email.com, email-2@email.com, email-3@email.com"; //yes with , at the beginning
delim = ";,";

当我运行上面的函数时,结果是:

[email-1@email.com,  email-2@email.com,  email-3@email.com]

space这很好,但是在 and之间,又增加了一个email

这是为什么?以及如何解决?

编辑:

这是打印输出的函数:

List<String> tokens = StringUtility.gettokens(email, ";,");
Set<String> emailSet = new LinkedHashSet<String>(tokens);

emails = StringUtils.join(emailSet, ", ");

呵呵,现在我看到了答案。

编辑 2 - 根本原因:

问题的根本原因是那一行代码:

emails = StringUtils.join(emailSet, ", ");

", "加入令牌时添加了一个额外的。从上面的示例中,一个令牌看起来像这样" email-1@email.com",当join应用它时,它将在令牌之前添加commaspace。因此,如果一个标记在字符串的开头有一个空格,那么它将在 comma 和 space 之间有两个空格

例子:

", "+ " email-1@email.com"=",<space><space>email-1@email.com"

4

5 回答 5

1

您的字符串中有空格,并且ArrayList' 的实现toString在每个元素之前添加了一个空格。这个想法是你有一个和的列表"x",输出应该是而不是"y""z""[x, y, z]""[x,y,z]"

您真正的问题可能是您在令牌中保留了空格。使固定:

public static List<String> gettokens(String input, String delim)
  {
    ArrayList<String> tokenArray = new ArrayList<String>();
    StringTokenizer tokens = new StringTokenizer(input, delim);
    while (tokens.hasMoreTokens())
    {
      tokenArray.add(tokens.nextToken().trim());
    }
    return tokenArray;
  }
于 2013-04-11T13:11:24.133 回答
1

我认为使用String 的split方法会更好,因为它会更短。您需要做的就是:

     String[] values = input.split(delim);

它将返回一个数组而不是一个列表。

您的空间的原因是因为您将其添加到您的打印方法中。

List<String> tokens = StringUtility.gettokens(email, ";,");
Set<String> emailSet = new LinkedHashSet<String>(tokens);

emails = StringUtils.join(emailSet, ", ");  //adds a space after a comma

所以StringTokenizer按预期工作。

在您的情况下,无需太多修改代码,您可以在删除重复项之前使用 trim 函数清除空格,然后使用分隔符“,”加入,如下所示:

 tokenArray.add(tokens.nextToken().trim());

你会得到没有两个空格的结果。

于 2013-04-11T13:09:01.550 回答
1

您可以更改分隔符以包含", "sapce,然后它将不会包含在标记元素中。

更简单的是使用返回字符串数组的split() 方法,所以基本上该方法看起来像:

public static ArrayList gettokens(String input, string delim)
{
   return Arrays.asList(input.split(delim));   
}
于 2013-04-11T13:09:07.940 回答
1

打印数组列表时,它会打印所有以逗号和空格分隔的对象。您的输入在每个逗号之前也有一个空格,因此会导致两个。

您可以使用:

tokenArray.add(tokens.nextToken().trim());

从您的输入中删除不需要的空格。

于 2013-04-11T13:09:33.093 回答
0

中间没有空格或逗号。

尝试将您的 ArrayList 打印为:

for(Object obj: tokenArray )
    System.out.println(obj);
于 2013-04-11T13:09:13.083 回答