2

我有一长串"abc_12.23;dcf_23.99;dfa_12.99;之类的。

现在我需要创建一个来将浮点数和字符串值分别分成浮点数和字符串数组。

我尝试将它们拆分为“;” 并将其放入一个数组中,然后对“_”进行拆分并将它们提取到一个数组中。但它不起作用。谁可以帮我这个事??

4

5 回答 5

2

可以说,使用 StringTokenizer 可能更有效率

    StringTokenizer st = new StringTokenizer("abc_12.23;dcf_23.99;dfa_12.99", "_;");
    int n = st.countTokens();
    String[] sa = new String[n / 2];
    float[] fa = new float[n / 2];
    for(int i = 0 ; st.hasMoreTokens(); i++) {
        sa[i] = st.nextToken();
        fa[i] = Float.parseFloat(st.nextToken());
    }
于 2013-02-19T14:12:14.433 回答
0

你的解决方案很好。

Followig 方法稍微提高了性能:

  • 将所有字符迭代成字符串。
  • 当你找到“_”或“;” 从最后一个相同的字符复制子字符串(如果当前;解析为浮点数,则它_比解析为字符串)并推入适当的数组。

不确定您是否会大大提高性能。

注意:我不是java专业人士,但如果java允许被几个字符溢出,只需用“;”分隔 和“_” 并为浮点数使用奇数索引,而对字符串使用奇数索引。

于 2013-02-19T14:07:23.833 回答
0

这是一个正则表达式解决方案:

    String input = "abc_12.23;dcf_23.99;dfa_12.99; and so on";
    String regex = "([a-zA-Z]+)_(\\d+(\\.\\d+)?);?";
    List<String> strings = new ArrayList<>();
    List<Double> floats = new ArrayList<>();
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        strings.add(matcher.group(1));
        floats.add(Double.valueOf(matcher.group(2)));
    }
    System.out.println(strings); // prints [abc, dcf, dfa]
    System.out.println(floats); // prints [12.23, 23.99, 12.99]
于 2013-02-19T14:14:05.193 回答
0

试试这个正则表达式:

(\w.)_(\d.\.\d.);

在这里测试一个正则表达式测试小程序

用于matcher.find()逐步完成比赛。

第 3 组(索引 2)将具有浮点值。

于 2013-02-19T14:15:20.403 回答
0

您可能会使用Scanner。它看起来像这样:

scanner = Scanner("abc_12.23;dcf_23.99;dfa_12.99;");
scanner.useDelimiter("[;_]");
while(scanner.hasNext()){
  String s = scanner.next();
  float f = scanner.nextFloat();
}
于 2013-02-19T14:17:27.043 回答