Сканер по сравнению с StringTokenizer по сравнению со строкой. Разделение

Я лично испытываю отвращение к ifelse и склонен вместо этого использовать две строки кода вместо того, чтобы заполнить значение по умолчанию, а затем альтернативу, примененную условно.

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

for(i in 1:10){
    HRSdata2[,paste0('h',i,'logass')] <- 0
    w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0)
    HRSdata2[w,paste0('h',i,'logass')] <-  HRSdata2[w,paste0('h',i,'atotb')]
}

Этот код выведет ноль для значений NA, если это не так Вы должны заменить:

w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0)

на:

w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0 | is.na( HRSdata2[,paste0('h',i,'atotb')] ) )
152
задан skaffman 26 January 2012 в 09:50
поделиться

5 ответов

Они - по существу лошади для курсов.

  • Scanner разработан для случаев, где необходимо проанализировать строку, вытащив данные различных типов. Это очень гибко, но возможно не дает Вам самый простой API для того, чтобы просто получить массив строк, разграниченный конкретным выражением.
  • String.split() и Pattern.split() дайте Вам легкий синтаксис для того, чтобы сделать последнего, но это - по существу все, что они делают. Если Вы захотите проанализировать получившие строки или изменить разделитель на полпути через в зависимости от конкретного маркера, то они не помогут Вам с этим.
  • StringTokenizer еще более строго, чем String.split(), и также немного более трудный для использования. Это по существу разработано для того, чтобы вытащить маркеры, разграниченные фиксированными подстроками. Из-за этого ограничения это о дважды с такой скоростью, как String.split(). (См. мое сравнение String.split() и StringTokenizer.) Это также предшествует регулярным выражениям API, который String.split() часть.

Вы отметите в моих синхронизациях это String.split() может все еще маркировать тысячи строк в нескольких миллисекундах на типичной машине. Кроме того, это имеет преимущество StringTokenizer то, что это дает Вам вывод как массив строк, который обычно является, что Вы хотите. Используя Enumeration, в соответствии с StringTokenizer, является также "синтаксически суетливым" большую часть времени. С этой точки зрения, StringTokenizer определенная трата пространства в наше время, и можно также просто использовать String.split().

237
ответ дан Dave Jarvis 23 November 2019 в 22:10
поделиться

Давайте запустимся путем устранения StringTokenizer. Это становится старым и даже не поддерживает регулярные выражения. Его состояния документации:

StringTokenizer класс прежней версии, который сохраняется по причинам совместимости, хотя ее использованию препятствуют в новом коде. Рекомендуется, чтобы любой ищущий эту функциональность использовал split метод String или java.util.regex пакет вместо этого.

Поэтому давайте выведем его сразу же. Это уезжает split() и Scanner. Каково различие между ними?

С одной стороны, split() просто возвращает массив, который помогает использовать цикл foreach:

for (String token : input.split("\\s+") { ... }

Scanner создается больше как поток:

while (myScanner.hasNext()) {
    String token = myScanner.next();
    ...
}

или

while (myScanner.hasNextDouble()) {
    double token = myScanner.nextDouble();
    ...
}

(Это имеет довольно большой API, не думайте, что это всегда ограничивается такими простыми вещами.)

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

Лично, единственное время я могу не забыть использовать Scanner для школьных проектов, когда я должен был получить ввод данных пользователем от командной строки. Это делает такую операцию легкой. Но если у меня есть a String то, что я хочу развестись, это - почти легкая задача для движения с split().

57
ответ дан Michael Myers 23 November 2019 в 22:10
поделиться

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

5
ответ дан Bill the Lizard 23 November 2019 в 22:10
поделиться

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

разделение пришло к существованию на JDK 1.4. Медленнее, чем токенизатор, но легче использовать, так как это является вызываемым от Строкового класса.

Сканер оказался на JDK 1.5. Это является самым гибким и заполняет давнишний разрыв на Java API для поддержки эквивалента известного семейства функций Cs scanf.

9
ответ дан H Marcelo Morales 23 November 2019 в 22:10
поделиться

String.split кажется намного медленнее, чем StringTokenizer. Единственное преимущество разделения состоит в том, что вы получаете массив токенов. Также вы можете использовать любые регулярные выражения в split. org.apache.commons.lang.StringUtils имеет метод разделения, который работает намного быстрее, чем любой из двух, а именно. StringTokenizer или String.split. Но загрузка ЦП у всех трех почти одинакова. Таким образом, нам также нужен метод, менее требовательный к процессору, который я до сих пор не могу найти.

4
ответ дан 23 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: