0

ComplexNumberというクラスがあり、ComplexNumberに変換する必要のある文字列があります(Javaを使用)。

「5+3i」または「6-2i」がある場合、これらの文字列を適切に解析するにはどうすればよいですか。2つの変数にする必要があり、残りは実行できます。

String complexNum = "5+3i"; 

前の文字列を2つのdouble型変数に分割する必要がありますdoublereal= 5;
ダブル画像=3;

String complexNum = "6-2i";

前の文字列を2つのdouble型変数に分割する必要がありますdoublereal= 6; double imag = -2;

誰かがこれをどのように行うかについてのサンプルコードを与えることができますか?デリメータとして使用するスペースがなく、正規表現を完全に理解していません(チュートリアルをたくさん読んだのですが、それでもクリックされません)


編集:

正規表現が最善の策である場合、適切な表現を作成する方法を理解するのに苦労しています。

次のコードを用意しました。

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

そして、私は適切な正規表現を書く方法を理解しようとしています。

4

4 に答える 4

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 番目に一致するグループの一部になります。

代替案 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);
于 2012-06-12T05:43:45.213 に答える
4

実数部分と img 部分には符号と指数も含まれる可能性があるため、複素数の解析はそれほど簡単ではありません。apache-commons-mathを使用できます。

ComplexFormat cf = new ComplexFormat();
Complex c = cf.parse("1.110 + 2.222i");
于 2012-06-12T05:47:50.453 に答える
0

正規表現は次のようになります。 (\\d+)([-+])(\\d+)iwhere\\d+は任意の桁数に[+-]一致し、 a+または a のいずれかに一致-し、 the はi単純にそれ自体に一致します。は()、一致する文字列の部分を選択するために使用されます。

このリンクから改作されたいくつかのコード:

    // 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ステートメントは必要ありません。

于 2012-06-12T06:00:32.667 に答える
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;
}
于 2012-06-12T05:48:59.240 に答える