我有一个名为: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();
我正在试图找出如何编写适当的正则表达式。
答案 0 :(得分:6)
有点像这样吗?
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"
这将使第二个匹配组的标志成为一部分。
或者,如果您确定字符串格式正确并且您不关心虚构部分的歌唱,则可以执行以下操作:
Scanner sc = new Scanner(complexNum).useDelimiter("[i+-]");
int real = sc.nextInt();
int imag = sc.nextInt();
哪个更简单。
如果你不确定字符串的格式,你仍然可以使用正则表达式来验证它:
if(complexNum.matches("(\\d+)[+-](\\d+)i")) {
//scanner code here
} else {
//throw exception or handle the case
}
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
语句。