2013-02-19 123 views
2

我有一个很长的字符串,如"abc_12.23;dcf_23.99;dfa_12.99;等等。从字符串中提取浮点值

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

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

+1

除非你决定使用真正的序列化,如JSON,这是一个很好的方法。下一个问题。 – 2013-02-19 14:01:11

+1

我们不知道你有没有看到任何代码的最佳解决方案。 – jlordo 2013-02-19 14:01:15

+1

问题的最佳解决方案通常是最容易的解决方案。如果这个解决方案对你来说很简单,那就去吧 – imulsion 2013-02-19 14:01:22

回答

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()); 
    } 
0

您的解决方案很好。

Followig接近位提高性能:

  • 迭代的所有字符转换为字符串。
  • 当您找到“_”或“;”从最后一个相同的字符复制子字符串(如果当前的 ;解析的是float,则它比被解析的字符串)并且推入 适当的数组。

不确定您的提升性能​​如何。

注意:我不是java pro,但是如果java允许由几个字符串分隔开“;”和“_”,对于浮点数使用奇数索引,对于字符串不使用奇数索引。

+0

好的建议,你可以发布一些代码? – Aubin 2013-02-19 14:10:05

+0

我没有java编译器=(如果你想我可以在C#上发布。 – 2013-02-19 14:11:56

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] 
0

试试这个正则表达式:

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

测试在这里A Regular Expression Test Applet

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

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

0

您可以使用扫描仪。它看起来像这样:

scanner = Scanner("abc_12.23;dcf_23.99;dfa_12.99;"); 
scanner.useDelimiter("[;_]"); 
while(scanner.hasNext()){ 
    String s = scanner.next(); 
    float f = scanner.nextFloat(); 
}