2017-02-18 5 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 здесь, но если у вас есть только целые числа, и строка отформатирована хорошо, вы действительно можете использовать' .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] 

Или

вы можете использовать Pattern вместе с matcher найти все желаемые значения, т.е. Обожженные или беззнаковых чисел с -?\\d+ регулярное выражение

Regex Demo -?\d+


Обновление: Для Double значения, вы можете использовать [^\\d-.]+ и убедитесь, что использовать Double вместо Integer вместе с Double.parseDouble

И с Pattern и Matcher-?\\d*\\.?\\d+

+0

Большое вам спасибо. Он работает, но он не работает хорошо для десятичных знаков, таких как 4.5 или .15. Какой разделитель будет работать для этого. Я пробовал несколько разделителей, и он рассматривает десятичное число как два очка. 1.5 станет двумя отдельными номерами 1 и 5 – frog4

+0

@ Frogel4 попробуйте обновление, так как я перенес мои ранее удаленные комментарии к моему ответу –

+0

Perfect. Большое вам спасибо – 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-]:

^: Находит регулярное выражение, которое должно соответствовать на Beginn линии.

\d: Любая цифра от [0-9]

-: '-' будет соответствовать, если он существует

0

А 1-линии решение:

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

Первоначальная заменить это удалите ведущие нецелевые символы (иначе раскол вернет пустой элемент в первом элементе).

Смежные вопросы