2017-02-18 41 views
4

我正在寫一個程序做載體功能不同的計算,但該方案我有截至目前劃定的負面數字。我一直在使用不同的分隔符嘗試,但我似乎無法得到正確的一個。如何分割字符串成只有正和負整數?

有誰知道如何分割字符串時保持正面和負面的數字?另外,有沒有辦法保留任何十進制值? 0.45將返回45和0.29將返回29

這是代碼:

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] [ -1,2,-3,4,-5,6]。所有的功能我已經做完美的罰款,但使用負值時不工作。

任何幫助,將不勝感激。

+1

與正則表達式,你可以很容易地使用' - ?\ d' – ultrajohn

+0

我不會依賴於在這裏拆分,但如果你只有整數和字符串格式良好,你真的可以使用'.split(「[^ 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())); 

輸出:

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

或者

你可以沿着使用Patternmatcher找到所有需要的值,即燙傷的無符號數與-?\\d+正則表達式

Regex Demo -?\d+


更新:對於Double值,可以使用[^\\d-.]+,並確保連同使用Double代替IntegerDouble.parseDouble

並與PatternMatcher使用​​

+0

非常感謝。它的工作原理,但它不適用於像4.5或.15小數。什麼分隔符將適用於此。我試過多個分隔符,它將小數點看作兩點。 1.5將成爲兩個單獨的數字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謝謝我更新了答案 –

0

使用[^\\d-]您的劃分方法,即twoVectors.split("[^\\d-]")

爲什麼[^\\d-]內:

^:查找正則表達式必須在初學者匹配線路。

\d:將匹配'-'如果存在

0

A 1行的解決方案::

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

初始替換是從[0-9]

-任何位刪除前導非目標字符(否則分割將返回第一個元素中的空白)。