创建一个在java中划分字符串的方法

时间:2012-06-12 05:37:23

标签: java math

我有一个名为:ComplexNumber的类,我有一个字符串,我需要将其转换为ComplexNumber(使用Java)。

如果我有:“5 + 3i”或“6-2i”,我该如何适当地解析这些字符串。我需要将它变为2个变量,我可以完成其余的工作。

String complexNum = "5+3i"; 

我需要将前一个字符串拆分为两个double类型变量 double real = 5;
double imag = 3;

String complexNum = "6-2i";

我需要将前一个字符串拆分为两个double类型变量 double real = 6; double imag = -2;

任何人都可以举例说明他们将如何做这件事吗?没有任何空间可用作分隔符,我不完全理解正则表达式(我已经阅读了一堆教程,但它仍然没有点击)


编辑:

如果正则表达式是最好的选择,我很难理解如何创建一个合适的表达式。

我准备了以下代码:

String num = "5+2i";
String[] splitNum = num.split();

我正在试图找出如何编写适当的正则表达式。

4 个答案:

答案 0 :(得分:6)

备选方案1

有点像这样吗?

String complexNum = "5+3i"; 
String regex = "(\\d+)[+-](\\d+)i";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(complexNum);

if(matcher.find()){
   int real = Integer.parseInt(matcher.group(1));
   int imag = Integer.parseInt(matcher.group(2));
}

如果您需要设置数字的符号部分,请将正则表达式更改为

String regex = "(\\d+)([+-]\\d+)i"

这将使第二个匹配组的标志成为一部分。

备选方案2

或者,如果您确定字符串格式正确并且您不关心虚构部分的歌唱,则可以执行以下操作:

Scanner sc = new Scanner(complexNum).useDelimiter("[i+-]");
int real = sc.nextInt();
int imag = sc.nextInt();

哪个更简单。

备选方案3

如果你不确定字符串的格式,你仍然可以使用正则表达式来验证它:

if(complexNum.matches("(\\d+)[+-](\\d+)i")) {
  //scanner code here
} else {
   //throw exception or handle the case
}

备选方案4

String[] tokens = complexNum.split("[i+-]");
int real = Integer.parseInt(tokens[0]);
int imag = Integer.parseInt(tokens[1]);
System.out.println(real +  " " + imag);

答案 1 :(得分:4)

解析复数并不容易,因为real和img部分也可以包含符号和指数。您可以使用apache-commons-math

ComplexFormat cf = new ComplexFormat();
Complex c = cf.parse("1.110 + 2.222i");

答案 2 :(得分:0)

试试这个:

    String complexNum = "5+3i"; 
    int j = 0 ;
    String real = getNumber();
    j++;
    String imag = getNumber();   

public String getNumber()
{
      String num ;
      char c;
      int temp;
      for( ; j < complexNum.length() ; j++)
       {
           c = complexNum.charAt(j);
           temp = (int) c;
           if(temp > 57 ||temp < 48)
                 break;
           else
                  num += c;
       }
     return num;
}

答案 3 :(得分:0)

您的正则表达式应如下所示:(\\d+)([-+])(\\d+)i其中\\d+将匹配任意数量的数字,[+-]将匹配+-i只是匹配自己。 ()用于选择匹配的字符串部分。

某些代码改编自this链接:

    // Compile the patten.
Pattern p = Pattern.compile("(\\d+)([-+])(\\d+)i");

// Match it.
Matcher m = p.matcher(string);

// Get all matches.
while (m.find() == true)
    System.out.println("Real part " + m.group(1) +
                 " sign " m.group(2) +
         " and imagionary part " + m.group(3));

当然,这些仍然是字符串,所以你需要使用像

这样的东西
int real = Integer.parseInt(m.group(1))

将值变为整数形式,并且可以使用if语句来修复虚部上的符号,例如

if(m.group(2).equals("-"))
    imaginary *= -1;
    //if the value is positive, we don't have to multiply it by anything

更新: Edwin Dalorzo上面的评论简化了此代码。使用正则表达式"(\\d+)([+-]\\d+)i"捕获虚部的符号,然后不需要if语句。