我是Java新手。有人可以给我一些关于如何在返回的字符串中获取字符串值的线索:
[(key1,value1), (key2,value2), (key3, value3)]
另请注意,值字段还可能包含,
逗号。我无法使用GSON方法,因为值在括号内和角括号内。唯一的解决方案是首先处理字符串以替换所有这些以符合JSON结构吗?
答案 0 :(得分:1)
您的问题存在一些问题。由于解析的值和键可能包含逗号,并且键和值仅以逗号分隔,因此您只能猜测逗号之间的数字是否属于值或键。此外,您没有指定键和值的类型。
如果输入String格式不正确,则以下代码不会抛出异常,如果提供错误的输入,则可能永远运行。此外,它将键和值之间的第一个逗号解释为分隔符。 我假设键和值都是String 类型,可以自己解析:
HashMap<String, String> result = new HashMap<>(6);
String text = "[(age,120), (eyes,5), (feet, 8)]";
int index = text.indexOf("[") + 1; // now one index after '['
while (index < text.length() && text.charAt(index) != '(')
index++; //skip until we hit the start: '('
//this loop runs once for every pair (key, value). In this example three times
main: while(index < text.length()) {
index++; //skip '('
// parse the key, until a comma appears
int keyStart = index;
while (text.charAt(index) != ',') index++;
int keyEnd = index;
index++; //skip ','
// parse the value, until a closing bracket appears
int valueStart = index;
while (text.charAt(index) != ')') index++;
int valueEnd = index;
// extract the actual Strings, using the parsed indices start & end
String key = text.substring(keyStart, keyEnd).trim();
String value = text.substring(valueStart, valueEnd).trim();
result.put(key, value);
// parse to the next pair (x,y), or exit
while (text.charAt(index) != '(') {
if(text.charAt(index) == ']')
break main; // finish parsing, break main loop
index++;
}
}
System.out.println(result); // output = {feet=8, eyes=5, age=120}
不相关的注释:此代码有效运行。使用String.substring,String.indexOf或甚至正则表达式,模式或类似的代码可能会多次处理相同的字符。 在此代码中,每个字符都被解析为exaclty一次,并且每个相关字符(值和键)仅被复制一次(并修剪)。
此外,语法相对自由:所有不相关的符号,如两对之间的任何文本,或空格,都会被忽略。 语法如下:
将解析[
和]
之间任何数量(包括0)的对
每对必须用括号括起来;键和值必须用逗号分隔。将使用第一个逗号。示例:( name , value )
对中的名称可以包含任何符号,包括)
和]
,但逗号除外。对中的值可以包含每个符号,包括]
和(
,但结束括号除外。
名称和值周围的空格将被删除。示例:( my name , val,ue )
- &gt; name = my name
和value = val,ue
。请参见String.trim()。
[(,)]
也是有效的语法,将导致HashMap中出现空字符串。
答案 1 :(得分:0)
请注意,我实际上并未尝试过运行此操作=)
该方法基本上是分割关于正则表达式“(”“)”的输入,以获得表示对的字符串数组。
然后,您将迭代此数组,并提取第一个“,”之后的所有内容。在这里,我们隐含假设键可能不包含字符“,”。
String str[] = "[(key1,value1), (key2,value2), (key3, value3)]".split("(.*)");
ArrayList<String> values = new ArrayList<>();
String tmp;
for(int i = 0; i < str.length; i++) {
values.add(str[i].substring(str[i].indexOf(","), str[i].length()))
}
答案 2 :(得分:0)
这是一个非常简单的例子,使用正则表达式来搜索键和值。注意;这不会支持包含空格的键/值对。它假定它只是一个单词。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
public class Main {
private static final Pattern KEY_VALUE_PAIR = Pattern.compile("\\(\\s?+([^,\\s]+)\\s?,\\s?+([^)\\s?]+\\s?+)\\)");
public static void main(String[] args) {
Map<String, String> pairs = getKeyValuePairs("[(key1,value1), (key2,value2), (key3, value3)]");
Iterator it = pairs.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove();
}
}
private static Map<String, String> getKeyValuePairs(String input) {
Map<String, String> matches = new HashMap<String, String>();
Matcher m = KEY_VALUE_PAIR.matcher(input);
while (m.find()) {
matches.put(m.group(1), m.group(2));
}
return matches;
}
}