Сколько букв и цифр специальные символы в текстовом поле [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

32
задан sirab333 1 July 2014 в 05:51
поделиться

3 ответа

Обновление для Swift 3:

let letters = CharacterSet.letters
let digits = CharacterSet.decimalDigits

var letterCount = 0
var digitCount = 0

for uni in phrase.unicodeScalars {
    if letters.contains(uni) {
        letterCount += 1
    } else if digits.contains(uni) {
        digitCount += 1
    }
}

(Предыдущий ответ для старых версий Swift)

Возможное решение Swift:

var letterCounter = 0
var digitCount = 0
let phrase = "The final score was 32-31!"
for tempChar in phrase.unicodeScalars {
    if tempChar.isAlpha() {
        letterCounter++
    } else if tempChar.isDigit() {
        digitCount++
    }
}

Обновление: Вышеупомянутое решение работает только с символами в наборе символов ASCII, то есть не распознает буквы Ä, é или ø в виде букв. Следующее альтернативное решение использует NSCharacterSet из фреймворческой структуры, которая может тестировать символы на основе их классов символов Unicode:

let letters = NSCharacterSet.letterCharacterSet()
let digits = NSCharacterSet.decimalDigitCharacterSet()

var letterCount = 0
var digitCount = 0

for uni in phrase.unicodeScalars {
    if letters.longCharacterIsMember(uni.value) {
        letterCount++
    } else if digits.longCharacterIsMember(uni.value) {
        digitCount++
    }
}

Обновление 2: Начиная с Xcode 6 beta 4, первое решение больше не работает, поскольку методы isAlpha() и связанные с ним (ASCII-only) были удалены из Swift. Второе решение все еще работает.

50
ответ дан Martin R 18 August 2018 в 17:33
поделиться
  • 1
    да, это прекрасно - как, черт возьми, вы узнали о «isAlpha», и "isDigit" :-) Я даже не знал, что они существуют. (Серьезно - вы искали их или вы уже сталкивались с ними в предыдущих путешествиях?) – sirab333 1 July 2014 в 06:13
  • 2
    @ sirab333: isalpha() и друзья хорошо известны в C, см., например, [Д0] developer.apple.com/library/ios/documentation/System/Conceptual/… . Так что у меня было только «только». чтобы выяснить, как их использовать из Swift. - Но обратите внимание, что это работает только для символов ASCII. Он не распознает буквы из «иностранных языков», такие как "ä", "и" или "ø". – Martin R 1 July 2014 в 06:27
  • 3
    и он распознает + и - как цифру – Christian Dietrich 1 July 2014 в 06:55
  • 4
    Интересно. У меня никогда не было C, C #, C ++ или каких-либо других C - я прыгнул прямо в Objective-C и никогда не оглядывался назад. В общем, тогда вы бы сказали, что это «законный»? решение - или есть более "чистый" Быстродействующий способ сделать это без участия C? – sirab333 1 July 2014 в 07:26
  • 5
    Не работает Swift 3.0 – Warpzit 31 October 2016 в 20:09

Используйте значения unicodeScalars

let phrase = "The final score was 32-31!"
var letterCounter = 0, digitCounter = 0
for scalar in phrase.unicodeScalars {
    let value = scalar.value
    if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) {++letterCounter}
    if (value >= 48 && value <= 57) {++digitCounter}
}
println(letterCounter)
println(digitCounter)
4
ответ дан Matthias Bauch 18 August 2018 в 17:33
поделиться

Я создал короткое расширение для подсчета букв и цифр для String

extension String {
  var letterCount : Int {
    return self.unicodeScalars.filter({ CharacterSet.letters.contains($0) }).count
  }

  var digitCount : Int {
   return self.unicodeScalars.filter({ CharacterSet.decimalDigits.contains($0) }).count
  }
}

или функции, чтобы получить счетчик для любого CharacterSet, который вы положили в

extension String {    
  func characterCount(for set: CharacterSet) -> Int {
    return self.unicodeScalars.filter({ set.contains($0) }).count
  }
}

использование:

let phrase = "the final score is 23-13!"
let letterCount = phrase.characterCount(for: .letters)
0
ответ дан Rick Pasveer 18 August 2018 в 17:33
поделиться
Другие вопросы по тегам:

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