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これは問題ありませんが、 との間,にもう 1 つ追加されていemailます。

何故ですか?そしてそれを修正する方法は?

編集:

出力を出力する関数は次のとおりです。

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

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

へへへ、そして今、私は答えを見ています。

編集 2 - 根本原因:

問題の根本的な原因は、次のコード行でした。

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

", "トークンを結合するときにエクストラを追加していました。上記の例から、1 つのトークンは次のよう" email-1@email.com"になり、適用されるとトークンの前にandjoinが追加されます。したがって、トークンの文字列の先頭にスペースがある場合、カンマとスペースの間に 2 つのスペースがありますcommaspace

例:

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

4

5 に答える 5

1

短くなるという理由だけで、Stringの分割メソッドを使用する方が良い方法だと思います。あなたがする必要があるのは、次のとおりです。

     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、期待どおりに動作します。

あなたの場合、コードをあまり変更せずに、重複を削除する前にトリム関数を使用してスペースをクリアし、次のように区切り記号「、」で結合できます。

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

そして、2 つのスペースなしで結果が得られます。

于 2013-04-11T13:09:01.550 に答える
1

delim を変更して sapce を含める", "と、tokens 要素に含まれなくなります。

文字列配列を返すsplit() メソッドを使用する方が簡単なので、基本的にメソッドは次のようになります。

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

配列リストを印刷する場合、すべてのオブジェクトをカンマとスペースで区切って印刷します。入力には各コンマの前にもスペースがあるため、2 つ発生します。

以下を使用できます。

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 に答える