2017-02-18 16 views
4

私はベクトル関数を使って異なる計算をするプログラムを書いていますが、私が今使っているプログラムは負の数字を区切ります。私は別のデリミタを使ってみましたが、正しいデリミタを得ることができません。文字列を正の整数と負の整数に分割する方法は?

誰かが文字列を分割するときに正と負の数字を保持する方法を知っていますか?また、小数値を保持する方法はありますか?

ArrayList<Integer> list = new ArrayList<Integer>(); 

String twoVectors = "a=<-1,2,-3> b=<4,-5,6>"; // vector and a and b 

String[] tokens = twoVectors.split("\\D"); 

for (String s : tokens) 
    if (!s.equals("")) 
     list.add(Integer.parseInt(s)); 

System.out.println(Arrays.toString(list.toArray())); 

私が取得したプログラムを実行すると、[1、2、3、4、5、6]の代わりに[する:0.45 45と0.29 29

を返す。これは、コードで返します-1,2、-3,4、-5,6]となる。すべての関数は、私は完全に正常に働いていますが、負の値を使用すると動作しません。

ご協力いただければ幸いです。

+1

regexを使うと、簡単に ' - ?\ d'を使うことができます – ultrajohn

+0

ここでは分割に頼ることはありませんが、整数しかなく文字列のフォーマットがうまくいけば' .split( "[^ 0-9 - ] + ")'。空の最初の要素を取り除くには、 '。^ [^ 0-9 - ] +"、 "") '最初に.replaceFirst("^[^ 0-9 - ] + " –

答えて

3

あなたは

String[] tokens = twoVectors.split("[^\\d-]+"); 

[^\\d-]+を使用することができます。数字以外のものと-

[]と一致:否定が一致しない平均(\\d-

[]

^の内側に言及したすべてのものと一致します

\\d-:数字0-9-文字

Regex Demo


String twoVectors = "a=<-1,2,-3> b=<4,-5,6>"; 

    ArrayList<Integer> list = new ArrayList<Integer>(); 

    String[] tokens = twoVectors.split("[^\\d-]"); 

    for (String s : tokens) 
     if (!s.equals("")) 
      list.add(Integer.parseInt(s)); 

    System.out.println(Arrays.toString(list.toArray())); 

出力:あなたは見つけることmatcherとともにPatternを使用することができます

[-1, 2, -3, 4, -5, 6] 

それとも

すべての所望の値が-?\\d+正規表現と符号付きまたは符号なしの数値、すなわち

Regex Demo -?\d+


更新:Doubleの値は、あなたが[^\\d-.]+を使用して、一緒にIntegerの代わりにDoubleを使用することを確認することができますDouble.parseDouble

PatternMatcherとを使用してください。​​

+0

ありがとうございました。それは動作しますが、4.5や15などの小数に対してはうまくいきません。どのデリミタがそのために働くでしょうか。私は複数のデリミタを試して、小数点を2つの点として扱います。 1.5は2つの別個の数字1と5になります – frog4

+0

@ Frogel4私は以前に削除したコメントを私の答え –

+0

に移動したので、更新を試してください。ありがとうございました – frog4

1

あなたが現在持っている正規表現は何でもの文字列を分割しますが、の数字です。したがって、数字以外のものはスプリッタとみなされます。このパターンに-記号を追加した場合、数字でないものまたは-記号が含まれます。これはいくつかのケースでは機能しますが、後で数字がない場合は-または.があると失敗します。

あなたがする必要があるのは、正規表現(例えば-?\d*.?\d+のような)に数字のフォーマットを指定し、このパターンのすべての一致を見つけることです。小数を解析できるように、数字をDoubleに変更する必要があります。

String twoVectors = "a=<-1,.2,-3> b=<4,-5,6>"; 

ArrayList<Double> numbers = new ArrayList<Double>(); 

Matcher matcher = Pattern.compile("-?\\d*\\.?\\d+").matcher(twoVectors);  
while (matcher.find()) { 
    numbers.add(Double.parseDouble(matcher.group())); 
} 
System.out.println(Arrays.toString(numbers.toArray())); 

出力

[-1.0, 0.2, -3.0, 4.0, -5.0, 6.0]

+0

ありがとうございます。私はベクトル関数を使用します:String twoVectors = "a = <-1.9,.2,-3> b = <4,-5.8,6>";プログラムは返されます:[-1.0、0.9、0.2、-3.0、4.0、-5.0、0.8、6.0] – frog4

+0

@ Frogel4 Thanks –

0

使用[^\\d-]あなたの分割方法、すなわちtwoVectors.split("[^\\d-]")

なぜ[^\\d-]内側:

^:beginnで一致しなければならない正規表現を検索します行の

\d:一致する'-'が1ライン溶液

0

存在する場合:

List<Integer> numbers = Arrays 
    .stream(twoVectors.replaceAll("^[^\\d-]+", "").split("[^\\d-]+")) 
    .map(Integer::new) 
    .collect(Collectors.toList()); 

初期の交換はである[0-9]

-から任意の数字先頭の非ターゲット文字を削除します(そうでない場合、分割は最初の要素の空白を返します)。

関連する問題