2016-01-22 9 views
1

Я пишу программу, которая вводит список чисел, разделенных запятыми, и суммируя общее число чисел. Например, у меня есть строка «10, 20, 30, 40, 50»Использование символов в качестве разделителя для StringTokenizer в Java

Я хочу извлечь каждое число «10» «20» «30» «40» «50» отдельно от строки и найти сумма списка номеров.

Я нашел решение, однако, я считаю, что мой код немного грязный, и когда я вернусь и посмотрю на него, у меня будет довольно много «WTF» за минуту.

Так,

мне было интересно, если есть лучший способ, чтобы написать следующую строку:

StringTokenizer inputTokenizer = new StringTokenizer(input, "- ,\\n\\r\\t\\b\\fabcdefghijklmnopqrstuvwxyz"); 

Моя цель состоит в том, что я хочу, чтобы программа использовать каждый символ, который является не число как разделитель для StringTokenizer. Так, например, строка "11abc33" должна делиться на "11" и "33".

Вот мой исходный код, что я придумал

public static void main(String[] args) { 
    do { 
     //Prompts user to enter a series of numbers and stores it in the String "input" 
     String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas."); 

     //total stores the sum of each number entered 
     int total = 0; 

     if ((input != null)) //checks if the user didn't cancel or quit the program 
     { 

      //sets every alphabetical character in the input String to lowercase 
      input = input.toLowerCase(); 

      //creates a StringTokenizer that uses commas and white spaces as delimiters 
      StringTokenizer inputTokenizer = new StringTokenizer(input, "- ,\\n\\r\\t\\b\\fabcdefghijklmnopqrstuvwxyz"); 

      //sums the total of each number entry 
      while (inputTokenizer.hasMoreTokens()) { 
       total = total + Integer.parseInt(inputTokenizer.nextToken()); 
      } 
     } else { 
      //exit the program because the user hit cancel or exit 
      System.exit(0); 
     } 

     //display the sum of the total number entries 
     JOptionPane.showMessageDialog(null, "Total: " + total); 

    } while (true); 
} 
+0

так что вы хотите разбить входную строку, используя пробел или запятую между цифрами? –

+0

Да или любой нецифровой символ –

+0

Ваши разделители кажутся сумасшедшими сложными, если вы хотите разделить только запятые. И если вы хотите использовать все эти разделители, вы можете проверить метод String.split() и использовать регулярное выражение, которое может выразить все это в гораздо более чистом синтаксисе. –

ответ

2

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

Вы писали

Моя цель состоит в том, что я хочу, чтобы программа использовать каждый символ, который является не число в качестве разделителя для StringTokenizer.

но это кажется немного ограниченным.Кажется, что самое главное, были бы жетоны, а не токенизатор, и если это действительно так, для вас, то регулярное выражение на основе String.split() может предложить удовлетворительную альтернативу:

for (String token : input.split("[^0-9]+")) { 
    int i = Integer.parseInt(token); 

    // ... 
} 

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

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

+0

Не могли бы вы просто разделить числа 0-9? Что, если бы я хотел разделить числа 0 на бесконечность? –

+0

@TommySaechao, нет, он разделит числа любой длины. 0-9 просто означает, что ваши номера содержат только символы от 0 до 9. И + после длины средства от одного символа до бесконечности. Этот ответ лучший. –

+0

@TommySaechao, строка регулярных выражений, на которой я предлагаю разбиение, соответствует любой последовательности из одного или нескольких символов ('+'), которые не являются ('[^]') десятичными цифрами ('0-9'). Каждый максимальный пробег, соответствующий этому регулярному выражению, будет считаться разделителем, поэтому результирующие разделительные строки будут теми, что осталось между: нужная цифра. –

4

отмечают, что StringTokenizer разделяющей номера и подстроки, используя пробелы в обычном режиме. я имею в виду с помощью этого конструктора StringTokenizer(string)

но вы можете использовать другой конструктор для разделения чисел с помощью strTokenizer

StringTokenizer(String str, String delim) 

, которые вы можете использовать "," в качестве DELIM параметра и все подстроки будут разделены в соответствии с ",", замок на этом пример:

String numbers = "10,20,30,40,50,60,70"; 
    StringTokenizer t = new StringTokenizer(numbers, ","); 
    int sum=0; 
    while (t.hasMoreTokens()) { 
     sum+=Integer.parseInt(t.nextToken()); 
    } 
    System.out.println("sum: " + sum); 

вы также можете сделать это просто используя метод split(String regex) в String класс
вот пример и решение для вас.

String numbers = "10,20,30,40,50,60,70";// all numbers 

    String[] separated_numbers = numbers.split(",");// separate them by comma 

    // calculating sum 
    int sum = 0; 
    for (String number : separated_numbers) { 
     sum += Integer.parseInt(number); 
    } 
    // print sum 
    System.out.println("sum: " + sum); 
+0

Я не знаю, почему был принят этот ответ. Именно так я решил эту проблему. –

+1

Я отказался, потому что, если вы глубоко изучите вопрос OP, есть противоречие, он хочет получить сумму всех цифр, что когда-либо между деитами, вход может быть 'qsdqskdqskdqsd254131qdsdgkljf' –

+0

@ Блокировка ЭнтониРеймонда на вопрос , он не хочет вычислять сумму всех цифр: «Я хочу извлечь каждое число,« 10 »« 20 »« 30 »« 40 »« 50 »отдельно от строки и найти сумму списка чисел. " –

1

Вы можете сделать это с помощью регулярных выражений

do { 
    String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas."); 

    int total = 0; 

    if ((input != null)) 
    { 
     Matcher m = Pattern.compile("(-?[0-9]+.[0-9]*)+").matcher(input); 
     // when using regex, the first group is always the full text, so we skip it. 
     for (int i = 1; i<=matcher.groupCount(); i++) { 
      total = total + Integer.parseInt(matcher.group(i)); 
     } 
    } else { 
     System.exit(0); 
    } 

    JOptionPane.showMessageDialog(null, "Total: " + total); 

} while (true); 
+0

Это решение должно корректно обрабатывать все числа '-12',' 12', '12.34' both works –

0

Вы можете заменить все несимвольные символы на один символ, а затем использовать метод split для получения массива всех чисел.

public static void main(String[] args) { 
    do { 
     //Prompts user to enter a series of numbers and stores it in the String "input" 
     String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas."); 

     //total stores the sum of each number entered 
     int total = 0; 

     if ((input != null)) //checks if the user didn't cancel or quit the program 
     { 
      String[] characterTokens = input.split("[^0-9]+"); 
      for (String characterToken : characterTokens) { 
       input.replace(characterToken, ","); 
      } 
      String[] numberTokens = input.split(","); 
      for (String numberToken: numberTokens) { 
       total += Integer.parseInt(numberToken); 
      } 
     } else { 
      //exit the program because the user hit cancel or exit 
      System.exit(0); 
     } 

     //display the sum of the total number entries 
     JOptionPane.showMessageDialog(null, "Total: " + total); 

    } while (true); 
} 

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

  • Нет связанных вопросов^_^