我是java编程的新手,我正在写一个" Complex"所以我可以学习一下OOP。
在编写 read()方法来获取复数的用户输入时,我遇到了问题。目前,用户必须输入由空格分隔的2个数字,并且这些数字将分别是实部和虚部。但是,如果他们输入类似" 3 + 4i"或" 3.23 + 4.1i",要么忽略整个事物,要么只读取第一个数字。
我希望通过允许用户以任何格式输入数字来加强这种方法,并允许他们简单地输入类似" 3i"而不是" 0 + 3i"。
我在研究时发现的通常涉及模式或 Double.parseDouble ,我都没有为我的案例工作。
我的问题是:如何检测这些字符,以便我能正确解析复数?
P.S:这是我现在读取用户输入的方法
if(userIn.hasNextDouble())
{
this.real=userIn.nextDouble();
}
if(userIn.hasNextDouble())
{
this.imag=userIn.nextDouble();
}
答案 0 :(得分:3)
阅读String
而不是Double
。然后:
boolean firstPositive = true;
boolean secondPositive = true;
if (s.charAt(0) == '-') // See if first expr is negative
firstPositive = false;
if (s.substring(1).contains("-"))
secondPositive = false;
String[] split = s.split("[+-]");
if (split[0].equals("")) { // Handle expr beginning with `-`
split[0] = split[1];
split[1] = split[2];
}
double realPart = 0;
double imgPart = 0;
if (split[0].contains("i")) // Assumes input is not empty
imgPart = Double.parseDouble((firstPositive ? "+" : "-") + split[0].substring(0,split[0].length - 1));
else
realPart = Double.parseDouble((firstPositive ? "+" : "-") + split[0]);
if (split.length > 1) { // Parse second part of expr if it exists
if (split[1].contains("i"))
imgPart = Double.parseDouble((secondPositive ? "+" : "-") + split[1].substring(0,split[1].length - 1));
else
realPart = Double.parseDouble((secondPositive ? "+" : "-") + split[1]);
}
// Use realPart and imgPart ...
System.out.println(realPart + (imgPart < 0 ? "" : "+") + imgPart + "i");
如果您只想支持Integer
,请将Double.parseDouble
更改为Integer.parseInt
。
它处理从3
到-5.123i
到-5-631231.2123123i
答案 1 :(得分:1)
易于实现的算法的想法可能有效:
- 阅读专栏// ex:“3.23 + 4i”--- ex2:“3.23”--- ex3:“4i”
- 摆脱所有空间// ex:“3.23 + 4i”--- ex2:“3.23”--- ex3:“4i”
- 醇>
用“+”字符分割// ex:[“3.23”,“4i”] --- ex2:[“3.23”] --- ex3:[“4i”]
4.1如果array =&gt;中有一个元素通过测试结果是否以“i”结束(相当简单)
来查找结果4.2如果数组中有两个元素=&gt;
4.2.1验证第一个元素是否以i结尾并相应地读取(相当简单)
4.2.2验证第一个元素是否以i结尾并相应地读取(相当简单)
我认为所有步骤都相对容易实施,但如果您对如何操作有疑问,请不要犹豫。我想有一些方法可以更优雅地使用模式等等,但有时候,最简单的事情也适用(如果你没有性能问题)。
Godd luck,
的Mathias
答案 2 :(得分:1)
我冒昧地这样做了。试一试吧。它不会检查输入是否错误。它将创建复数,将它们存储在ArrayList中,并将新创建的数字输出到屏幕上。
import java.util.ArrayList;
import java.util.Scanner;
public class Complex {
Double real=0d;
Double complex=0d;
Complex(Double real, Double complex){
this.real=real;
this.complex=complex;
}
Complex(){
}
public void setReal(Double real){
this.real=real;
}
public void setComplex(Double complex){
this.complex=complex;
}
public Double getReal(){
return real;
}
public String getComplex(){
return complex+"i";
}
public String toString(){
if (real==0d)
return complex+"i";
else if (complex==0d)
return real+"";
else
return real+" + "+complex+"i";
}
static ArrayList<Complex> complexList=new ArrayList<Complex>();
public static void createComplex(){
Scanner scanner=new Scanner(System.in);
System.out.println("Type the complex numbers; Type Done to finish!");
String x=scanner.next();
while (!x.equals("Done")){
// System.out.println(x);
Complex no=new Complex();
//check if the user has inputted only one number
if (!x.contains("+")&&!x.contains("i")){
no.setReal(Double.parseDouble(x));
x= scanner.next();
//ask for the second number; no wrong input checks
no.setComplex(Double.parseDouble(x));
}
//check if the user inputted something like 123.3i
else if (!x.contains("+")&&x.contains("i")){
//create the complex number; replace i with ""
x=x.replace("i","");
// System.out.println(x);
no.setComplex(Double.parseDouble(String.valueOf(x)));
}
else{
//else remove the + sign and create a complex number
//input like 123.3+32i
//no wrong input checks
x= x.replaceAll("\\s+","");
String[] tokens = x.split("\\+");
no.setReal(Double.parseDouble(String.valueOf(tokens[0])));
tokens[1]=tokens[1].replace("i","");
no.setComplex(Double.parseDouble(String.valueOf(tokens[1])));
}
//ask for next input until Done is typed
x=scanner.next();
complexList.add(no);
}
}
public static void main(String[] args) {
createComplex();
for (Complex x:complexList){
System.out.println(x.toString());
}
}
}
测试输入&amp;输出:
Type the complex numbers; Type Done to finish!
123.123
412231.21
123i
9i
1+9i
123+12312.3i
Done
123.123 + 412231.21i
123.0i
9.0i
1.0 + 9.0i
123.0 + 12312.3i
答案 3 :(得分:0)
第一次尝试做:
String test="3+4i";
String[] temp=null;
String realString=null;
String imagString=null;
if(test.contains("+")){
temp=test.split("\\+");
}
else if(test.contains("-")){
temp=test.split("-");
}
if(temp[0].contains("i")){
realString=temp[1];
imagString=temp[0].trim().split("i")[0];
}
else{
realString=temp[0];
imagString=temp[1].trim().split("i")[0];
}
System.out.println(realString+ " " +imagString);
这只是第一次帮助你。你必须调整它以接受像#34; -3,14i + 12&#34;这样的数字。 而且你仍然需要将字符串解析成正确的格式。
答案 4 :(得分:0)
我知道这是一项学习任务,您希望自己实施,但如果其他人会阅读此问题,那么使用Apache Commons Math库会更好。它有一个ComplexFormat
类,可以解析复数:
String str = "3.23+4.1i";
Complex c = new ComplexFormat().parse(str);
double realPart = c.getReal();
double imaginaryPart = c.getImaginary();