Как разделить числа из строки в Java? - PullRequest
3 голосов
/ 03 января 2012

У меня проблемы с поиском способа разбить числа строк. Я уже разбил строку на несколько символов.

так что если выражение было gi356f это дало бы:

g
i
3
5
6
f

Но я хочу, чтобы 356 считался числом в своем собственном отношении. и проблема, с которой я имею дело, состоит из строк, которые выглядят как (345+3)*/3

Я попытался просмотреть текущий символ в строке и следующий, и попытался проверить, является ли это цифра и, если да, прикрепил их, но это привело ко многим ошибкам. например, он будет обрабатывать только двузначные длинные числа, а также не очень хорошо, если строка будет 43, он будет использовать 3 дважды. (например, один раз для 43 и снова для 3 на это включено). Также, если выражение в конце оканчивалось номером данной строки, если бы также обрабатывалось дважды.

Я не уверен, как решить эту проблему. Я думаю, может быть, использовать регулярные выражения или сканер, но не знаю, как это сделать, даже после того, как вы посмотрите на некоторый код в Интернете небольших примеров.

Ответы [ 6 ]

3 голосов
/ 03 января 2012

Вы можете использовать регулярные выражения для этого.Вот решение для простого случая (только целые числа).\\d является десятичным числом, а плюс + говорит один раз или более .Для получения дополнительной информации смотрите http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html.

import java.util.regex.*;

public class Main {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher("(345+3)*/3");
    while(m.find())
      System.out.println(m.group());
  }
}
1 голос
/ 03 января 2012

Вы можете использовать регулярные выражения. Вот (очень грубый) набросок:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

String findIntegerOccurrence(String inputString)
{
    // Define pattern to match your numbers here.
    Pattern pattern = Pattern.compile("... reg expr here...");
    Matcher matcher = pattern.matcher(inputString);

    if (matcher.find()) // Checks if the regular expression matches.
    {
        // Extract the substring of inputString that has matched
        return matcher.group();
    }
    else
    {
        return null;
    }
}

В основном вам нужно определить подходящее регулярное выражение для ваших чисел, а затем использовать его, чтобы найти все вхождения во входной строке. Приведенный выше пример является лишь наброском, чтобы увидеть, как вы определяете регулярное выражение и сопоставляете его. Поскольку вы хотите сопоставить все вхождения чисел и отделить их от остальной части ввода, вам потребуется более сложное решение (в приведенном выше примере показано, какие классы вам нужны, и некоторые полезные методы).

Вы можете найти все подробности о регулярных выражениях в Java в документации Java

EDIT

Удалено редактирование: я добавил описание необходимого регулярного выражения, но такое же регулярное выражение было добавлено в качестве комментария к другому ответу за несколько минут до того, как я смог завершить свои изменения. Пожалуйста, обратитесь к другому ответу.

1 голос
/ 03 января 2012

Здесь может помочь структура данных стека. Итак, вот что вы можете сделать:

  1. Сканирование каждого символа.
  2. Проверьте, является ли символ числом. Если да, положить в стек.
  3. Продолжайте добавлять символ в стек, пока не получите какой-либо нечисловой символ.
  4. Как только вы получите нецифровый символ, выньте все числовые символы из стека и преобразуйте в число.
  5. Продолжайте, пока символ не закончится.
0 голосов
/ 15 января 2014

Я тоже создаю калькулятор и использую стеки, чтобы разбить уравнение на числа и операторы, как сказал @Gaurav. Вот код, который я использую:

for (int i=0; i<equation.length(); i++) {

            equationChar = String.valueOf(equation.charAt(i));

            if (numbers.contains(equationChar)) {

                equationHold += equationChar;

                if (i==(equation.length()-1)) {

                    stackNumbers.push(equationHold);    
                }

            } else {

                stackNumbers.push(equationHold);
                stackOperators.push(equationChar);
                equationHold = "";

            }

        }

Я нашел это намного проще, чем иметь дело с выражениями String Split. Я еще не разбираюсь в скобках и прочем, поэтому код может измениться.

0 голосов
/ 23 мая 2012
Pattern pp = Pattern.compile("\\d+");
Matcher m = pp.matcher("sdfsdf123sdfs3464ew111");
While(m.find())
{
    System.out.println(m.group());
}

вывод будет:

123
3464
111

проверить!

0 голосов
/ 03 января 2012

Если вам не нужны нечисловые символы, выполните следующие действия:

Один раз проанализируйте строку, заменив все нечисловые символы пробелом.Анализируем полученную строку, удаляя при этом двойные пробелы.входная строка gi356f сначала станет _ 356 , а _ будет пробелами.Если вы затем удалите двойные пробелы, у вас будет то, что вы искали.

Другой пример: d45 * 9j становится _45_9_, а затем, когда вы разделите его на подстроки, у вас будет 45 и 9 и отдельные числа.

Есть много способов сделать это, лучший способ - попробовать разные подходы, пока не найдете то, что работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...