解析java中的复数

时间:2015-08-14 14:04:43

标签: java

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

5 个答案:

答案 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)

易于实现的算法的想法可能有效:

  
      
  1. 阅读专栏// ex:“3.23 + 4i”--- ex2:“3.23”--- ex3:“4i”
  2.   
  3. 摆脱所有空间// ex:“3.23 + 4i”--- ex2:“3.23”--- ex3:“4i”
  4.   
  5. 用“+”字符分割// 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结尾并相应地读取(相当简单)

    •   
  6.   

我认为所有步骤都相对容易实施,但如果您对如何操作有疑问,请不要犹豫。我想有一些方法可以更优雅地使用模式等等,但有时候,最简单的事情也适用(如果你没有性能问题)。

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