2012-04-07 4 views
4

Я работаю над программой, в которой пользовательский ввод представляет собой массив смешанных строк и целых чисел. Для примера:Решение целых чисел и строк в Java

собаки 10 23 кошки лягушки 22 слон

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

кошка 10 22 собаки слон 23 лягушка

После прочтения строки из консоли, я использую строку Tokenizer пройти через каждый элемент. После этого я пытаюсь parseInt, и если он генерирует исключение, я предполагаю, что это строка, иначе это Integer. Есть ли лучший способ выяснить, является ли токен численным или нет?

спасибо.

ответ

7

Опираясь на исключения для программной логики, считается плохой практикой, поскольку исключения медленны. Вместо этого вы можете использовать регулярные выражения.

Matcher numericalMatcher = Pattern.compile("^-?\\d+$").matcher(token); 
if(numericalMatcher.matches()) { 
    // Token is a number 
} else { 
    // Token is not a number 
} 

См http://docs.oracle.com/javase/1.6.0/docs/api/java/util/regex/Pattern.html и http://docs.oracle.com/javase/1.6.0/docs/api/java/util/regex/Matcher.html

+0

+1 О том, чтобы не полагаться на исключения в нормальном потоке программы. @Mehmet: Если вы хотите разрешить отрицательные числа, введите '-?' После '^' в начале регулярного выражения (что означает «ноль или один символ' - »). –

+4

Я не согласен. Исключения выполняются медленно, но не оптимизируются, пока вам не понадобится. Я бы написал частный статический метод 'isNumber' и использовал реализацию try/parseInt/catch для его реализации. Достаточно легко обменивать его, если он слишком медленный. –

+0

@ KeithRandall: Это не оптимизация. Если вы собираетесь писать 'isNumber', почему бы не написать его правильно в первую очередь? Если бы была какая-то значительная работа, абсолютно, не оптимизируйте преждевременно, хотя я бы очень * использовал исключения из более чем 50% обычного потока программ (на примеры из OP). Но здесь просто нет. –

3

Использование parseInt - неплохая идея.

В качестве альтернативы вы можете использовать регулярное выражение, но я считаю, что ваш выбор более практичен и прост.

+0

* «... более практичный и быстрый» * Не быстрее, нет. Все эти исключения, вызванные нечисловым вводом как * нормальный * случай ... –

+0

быстро реализовать :) – dash1e

+0

@ dash1e: Ах, ладно. –

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