给定一个字符串
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()]);
}
我还需要考虑我的密钥没有值(a =)的情况,在这种情况下我应该为我的密钥设置一个默认值 - 一个空字符串(a=""
)。
我该怎么做?
答案 0 :(得分:0)
你是正确的方式,首先与&#34;&amp;&#34;并且使用&#34; =&#34;进行拆分,当第二个拆分在索引1处没有项目时,您知道没有值,您可以将其设置为emptyString。只需使用其中一个案例进行调试,您就会找到正确的解决方案。
答案 1 :(得分:0)
这是你试图解析的查询字符串,通常最简单的方法绝对不是自己编写,而是寻找执行这种简单任务的库。我可以建议https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html#parse(java.lang.String,%20java.nio.charset.Charset)
答案 2 :(得分:0)
为什么不使用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);
}
}
为示例返回值的Arrays.toString()输出:
[abc, =, 1.0, &, b, =, 2.0, &, fa, =, _]
关于第二个问题(=
之后的默认值):为了简单起见,我会在第二个循环中对令牌数组(结果)进行后处理,并检查是否立即跟踪=
通过&
或最后,在这种情况下,在=
令牌后插入一个空字符串。