Java 从输入字符串中获取令牌的最简单方法是什么?

Java 从输入字符串中获取令牌的最简单方法是什么?,java,Java,给一串 abc=1&b=2&fa=_ 我需要将其拆分以获得令牌数组: ["abc", "=", "1", "&", "b", "=", "2", "&", "fa", "=" , "_"] 我的代码: public String[] getTokens(String input) { List<String> list = new ArrayList<>(); String[] splitted = input.spli

给一串

abc=1&b=2&fa=_
我需要将其拆分以获得令牌数组:

["abc", "=", "1", "&", "b", "=", "2", "&", "fa", "=" , "_"]
我的代码:

public String[] getTokens(String input) {
    List<String> list = new ArrayList<>();
    String[] splitted = input.split("&");

    for (int k = 0, splittedLength = splitted.length; k < splittedLength; k++) {
        String part = splitted[k];
        String[] kv = part.split("=");
        for (int i = 0, kvLength = kv.length; i < kvLength; i++) {
            String elem = kv[i];
            list.add(elem);
            if (i < kvLength - 1) {
                list.add("=");
            }
        }
        if (k < splittedLength - 1){
            list.add("&");
        }
    }

    return list.toArray(new String[list.size()]);
}
public String[]getTokens(字符串输入){
列表=新的ArrayList();
String[]splitted=input.split(&);
for(int k=0,splittedLength=splitted.length;k

我还需要考虑当我的密钥不能有一个值(A=)的情况下,在这种情况下,我应该为我的键设置一个默认值——一个空字符串(<代码> A=)“”。


我该怎么做呢?

您的方法是正确的,首先用“&”进行拆分,然后用“=”进行拆分,当第二次拆分的索引1中没有项目时,您知道没有值,可以将其设置为emptyString。只需调试其中一种情况和另一种情况,您就会找到正确的解决方案。

这是您试图解析的查询字符串,通常最简单的方法肯定不是自己编写,而是寻找执行这种琐碎任务的库。因此,我建议您为什么不直接使用java.io.StreamTokenizer:

public static String[] getTokens(String input) {
  try {
    ArrayList<String> result = new ArrayList<>();
    StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(input));
    while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
      switch (tokenizer.ttype) {
        case StreamTokenizer.TT_WORD:
          result.add(tokenizer.sval);
          break;
        case StreamTokenizer.TT_NUMBER:
          result.add(String.valueOf(tokenizer.nval));
          break;
        default:
          result.add(String.valueOf((char) tokenizer.ttype));
      }
    }
    return result.toArray(new String[result.size()]);
  } catch (IOException e) {
    throw new RuntimeException(e);
  }
}

关于第二个问题(
=
之后的默认值):为了简单起见,我将在第二个循环中对令牌数组(结果)进行后处理,并检查
=
后面是否紧跟着
&
,或者在最后,在本例中,在
=
标记后插入一个空字符串。

这取决于您对标记的定义。请参阅从URL查询字符串获取映射。我认为您的解决方案不起作用。如果钥匙是
k1
,该怎么办?然后标记器将其分为两个元素(
k
1
),这是错误的。。。为什么您认为StreamTokenizer将在k和1之间拆分?来自javadoc:“一个单词标记由一个单词成分,后跟零个或多个单词成分或数字成分组成。”
[abc, =, 1.0, &, b, =, 2.0, &, fa, =, _]