拆分一个包含多个字母和字母的字符串 - android

时间:2017-01-21 23:21:37

标签: java android

Android java非常新,我有一个简单的问题。我有字符串,例如:

P:38,AS:31,DT:231,AR:21

我想将其分成以下形式的4个不同列表:

P(list)  = 38
AS(list) = 31
DT(list) = 231
AR(list) = 21

我试过拆分,但它没有完成工作......

2 个答案:

答案 0 :(得分:2)

只要键始终为字母且值始终为整数,您就可以使用正则表达式来解析这些字符串:

Hashtable<String, int[]> result = new Hashtable<String, int[]>();
Pattern pattern = Pattern.compile("([A-Z]+):(\\d+(?:,\\d+)*)");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    String key = matcher.group(1);
    String[] fields = matcher.group(2).split(",");

    int[] values = new int[fields.length];
    for (int i=0; i<values.length; i++)
        values[i] = Integer.parseInt(fields[i]);

    result.put(key, values);
}

修改

"([A-Z]+):(\\d+(?:,\\d+)*)"是一个regular expression,至少匹配一个大写字母([A-Z]+),后跟一个冒号(:),后跟另外一个以逗号分隔的数字({ {1}})。单个数字由另外一个数字(\\d+(?:,\\d+)*)组成。附加括号允许我们稍后使用\\d+方法调用访问输入字符串的各个部分。

java.util.regex.Matcher类允许我们遍历输入字符串中与正则表达式匹配的各个部分。只要我们的输入字符串中有另一个与正则表达式匹配的子字符串,find()方法就会返回group(int)。因此,对于输入字符串true"P:38,45,AS:31,DT:231,345,678,AR:21"循环将执行四次,while变量将指向输入字符串的以下四个子字符串:

  • matcher
  • P:38,45
  • AS:31
  • DT:231,345,678

然后我们可以使用AR:21的{​​{3}}方法来访问每个子字符串的各个部分。 matcher访问我们的正则表达式(matcher.group(1))的第一个括号捕获的文本,该文本对应([A-Z]+)"P""AS"和{{ 1}}在各个循环迭代中。类似地,"DT"对应于正则表达式("AR")的第二个括号,它将返回matcher.group(2)(\\d+(?:,\\d+)*)"38,45""31" 。因此,在"231,345,678"循环"21"的第一次迭代中,while将保持key,而"P"将保留字符串数组fields。然后,我们可以使用group(int)将字段解析为实际的整数值,并将键和值存储在Integer.parseInt(String)中,以便稍后检索各个键的值。例如,["38", "45"]将返回值为result.get("DT")的整数数组。

答案 1 :(得分:0)

正如@pobybolek所说,你可以使用他编写的方法获取字符串并将其转换为哈希表,哈希表使用键,然后使用键后的int值。 int值存储在数组中,键是字符串。

comp1Fn()

上面的代码将给定的字符串拆分为其键,并将键后的值拆分为整数数组,这也可以更改为String键,String []数组,如我代码的第二行所示。