Java - 将字符串转换为数字的想法(RegEx / Parsing / etc.)?

时间:2014-03-07 04:56:55

标签: java regex file parsing

我正在读取文件,输入如下:

Description (1.0,2.0) (2,7.6) (2.1,3.0)
Description2 (4,1)
...
Description_n (4,18) (8, 7.20)

我希望能够将数字放在括号内并使用从字符串转换为数字,以便我可以对它们进行数学运算。现在,为了简化事情,我的代码只读取第一行,然后根据空格分割它:

BufferedReader reader = null;

try {
    reader = new BufferedReader(new FileReader(new File("filename.txt")));

    //reader reads in the first line
    String firstLine = reader.readLine();

    //splits into an array of ["Description","(1.0,2.0)","(2,7.6)","(2.1,3.0)"]
    String[] parts = first.split(" "); 

    //now I want to store 1.0, 2, and 2.1 in one array as ints and 2.0, 7.6, and 3.0 in another int array

} catch (Exception e) {
    System.exit(0); 
}

有什么方法可以将括号内的数字存储到两个单独的整数数组中(参见上面的注释)?我应该使用正则表达式以某种方式捕获“([1-9。],[1-9。])”形式的东西,然后将它们传递到另一个函数,然后将该对中的第一个数字与第二个和然后将它们转换成整数?我是Java中正则表达式解析的新手,所以我不确定如何实现它。

或者有一种简单,更好的方法吗?

4 个答案:

答案 0 :(得分:1)

如何解析每个项目:

Double.parseDouble(“你的字符串在这里”);

至于存储,我没有得到你想要存储你的值的模式。你想要1个数组中的1.0,2和2.1以及2.0,7.6和3.0的另一个数据的原因是什么?

答案 1 :(得分:1)

只需执行Integer.parseInt(string)或Double.parseDouble(string),然后将其添加到数组中。但是,我并不是100%确定你要问的是什么。

答案 2 :(得分:1)

这会将数字存储到Double - 数组(不是二维数组,Double个对象的数组),因为有些数据有.#。 int-arrays将消除后十进制部分。

它使用正则表达式\b([\d.]+)\b查找每个paren-group中的每个数字,并将每个数字添加到ArrayList<Double>。请注意,它假设所有输入都是完美的(不像(bogus,3.2)。然后将列表转换为Double个对象的数组。

这应该会为你的目标提供良好的开端。

import  java.util.Arrays;
import  java.util.ArrayList;
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;

/**
   <P>{@code java DoubleInParenStringsToArrays}</P>
 **/
public class DoubleInParenStringsToArrays  {
   public static final void main(String[] ignored)  {
      String input = "(1.0,2.0) (2,7.6) (2.1,3.0)";
      String[] inputs = input.split(" ");

      //"": Dummy string, to reuse matcher
      Matcher mtchrGetNums = Pattern.compile("\\b([\\d.]+)\\b").matcher("");
      for(String s : inputs)  {

         ArrayList<Double> doubleList = new ArrayList<Double>();
         mtchrGetNums.reset(s);
         while(mtchrGetNums.find())  {
            //TODO: Crash if it's not a number!
            doubleList.add(Double.parseDouble(mtchrGetNums.group(0)));
         }

         Double[] doubles = doubleList.toArray(new Double[doubleList.size()]);
         System.out.println(Arrays.toString(doubles));
      }
   }
}

输出:

[C:\java_code\]java DoubleInParenStringsToArrays
[1.0, 2.0]
[2.0, 7.6]
[2.1, 3.0]

答案 3 :(得分:0)

我会使用字符串标记符。但是需要更多的信息和想法才能完全实现。

这是你的行:“描述(1.0,2.0)(2,7.6)(2.1,3.0)”

首先 - 有没有括号的情况?会不会有f 2,2,2个数字?

您是否想要处理每个号码的错误,或者只是在出现错误时跳过该行或跳过处理(如数字的数量不匹配?)。

现在您需要一个数据结构来保存数字。如果每个数字在域中具有不同的含义,或者如果要将它们视为简单的数字列表,则可以创建一个类以将每个单独的元素保存在单独的属性中(如果每个数字在域中具有不同的含义)或具有数组列表或简单数组。如果是一级样本(不完整):

class LineItem {

}

现在要实际分解字符串有很多方法可以做到这一点。真的取决于数据的质量以及您希望如何处理可能的错误

一种方法是找到第一个左括号(取其余的字符串并使用字符串标记符解析出来。

类似的东西:

int i = str.indexOf("(");
String s2 = str.substring(i);
StringTokenizer st = new StringTokenizer(s2, "() ,";//parenthesis, comma and space

ArrayList<Double> lineVals1 = new ArrayList<Double>();
ArrayList<Double> lineVals1 = new ArrayList<Double>();
int cnt = 0;
while(st.hasMoreTokens()){
    cnt++;//use this to keep count of how many numbers you got in line and raise error if need be
    String stemp = st.nextToken();
    if(isNumeric(stemo)){
         if(cnt % 2 == 1){
             lineVals1.add(Double.parseDouble(stemp));
         }else{
            lineVals2.add(Double.parseDouble(stemp));    
         }    
    }else{
         /raise error if not numberic
    }
}


public static boolean isNumeric(String str)
{
  NumberFormat formatter = NumberFormat.getInstance();
  ParsePosition pos = new ParsePosition(0);
  formatter.parse(str, pos);
  return str.length() == pos.getIndex();
}