Posso filtrar o primeiro caractere como Cordas e segundo personagem como Int em uma matriz?

votos
1

Eu imagino se é possível filtrar o primeiro caractere como corda e segundo personagem como Int? Por exemplo eu tenho M1: test Me B2: test Mem uma matriz.

Se eu usar este código:

filter{$0.contains(M)

ele está indo para filtrar tanto M1e B2porque em ambos há o Mcaráter

E eu estou pensando se há alguma maneira de usar algo como filter{$0.contains(M+number), para que ele possa filtrar apenas se houver um número depois M.

Publicado 07/11/2017 em 19:54
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Você pode mapear suas cordas Spliting os componentes separados por ":". Adicionar um guarda para filtrar a elementos prefixo resultante que começa com a letra desejada, solte o primeiro caractere que prefixo e coagir a string resultante para Int:

let array = ["M1: test","M2: test", "B2: test"]

let values: [Int] = array.flatMap {
    guard
        let prefix = $0.components(separatedBy: ":").first,
        prefix.first == "M" else { return nil }
        return Int(prefix.dropFirst()) ?? 0
}

print(values)  // "[1, 2]\n"

Se você precisar agrupá-los e cortar os espaços em branco:

let array = ["M1: test"," M2: test", "B2: test"]

let results = array.flatMap{ string -> (letter: String, value: Int, note: String)? in
    guard
        case let components = string.components(separatedBy: ":"),
        let prefix = components.first?.trimmingCharacters(in: .whitespaces),
        let suffix = components.last?.trimmingCharacters(in: .whitespaces),
        let letter = prefix.first else { return nil }
    return (String(letter), Int(prefix.dropFirst()) ?? 0, suffix)
}

print(results)  // "[(letter: "M", value: 1, note: "test"), (letter: "M", value: 2, note: "test"), (letter: "B", value: 2, note: "test")]\n"

Se você só precisa os elementos que hasPrefix "M":

let filtered = array.filter { $0.hasPrefix("M") }

print(filtered)  // "["M1: test", "M2: test"]\n"\n"
Respondeu 07/11/2017 em 20:11
fonte usuário

votos
0

Tente usar isso. Assumindo que o seu conjunto de valores é nomeado de dados, dividir cada valor no cólon. Dê o primeiro substring e verifique se "M". Se for encontrado return true caso contrário false.

let data = ["M1: test M", "B2: test M", "M21: test A"]
let result = data.filter { $0.split(separator: ":").first?.contains("M") ?? false }

digite descrição da imagem aqui

Respondeu 07/11/2017 em 20:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more