Swift와 같은 배열된 벽장을 처리하는 방법(map,sort,filter)을 배웠다.

12094 단어 Swift
열심히 공부하기 시작한 지 한 달도 안 됐어요.
역시 벽장에 대해 잘 모르는 의식을 가지고 있군.
옷장은 도대체 무엇이냐
전에도 이런 Qita 기사를 썼는데 이 단계는 교과서의 정의를 알고 있지만
그렇다면 구체적으로 사용된 상황은...?아직 잘 모르겠어요.
이럴 때는 배열 처리를 할 때 추가 요소를 일일이 순환시킨다
나는 맵이라는 물건을 매개 변수에 넣으면 한 줄만 있으면 실현할 수 있다는 것을 안다
에이, 벽장이 강하니까 공부를 했지.

Swift 같지 않은 맞춤법


맵으로 쓰지 않으면 이런 느낌이에요.
2D 배열로 표준 입력
//1 3 1
//3 2 2
//2 3 5
//3 4 4
//1 6 6
//こんな標準入力が与えられるので、[[1,3,1],[3,2,2],...]みたいな感じで初期化したい
let numberOfInputLines = 5
var input_lines = [String]() //標準入力をとりあえず受け取る
var outArray: [[Int]] = [[Int]]() //変換先の二次元配列

for i in 0..<numberOfInputLines {
    input_lines.append(readLine()!)
    let splits: [String] = input_lines[i].components(separatedBy: " ") 
    outArray.append([Int(splits[0])!, Int(splits[1])! , Int(splits[2])!])
}
print(outArray) //[[1, 3, 1], [3, 2, 2], [2, 3, 5], [3, 4, 4], [1, 6, 6]]
지금도 하고 싶은 게 있지만.
  • 하고 싶은 일에 대한 코드가 길다
  • .appeend()의 중복은 좀 촌스럽다
  • outArry 초기화 후 내용은 변경되지 않습니다.appeend () 에 요소를 추가하기 위해 var 지정
  • 등의 질문을 던진다.

    Swift 같은 맞춤법


    맵으로 하면 이렇게 쓸 수 있어요.
    표준 입력을 2차원 배열로 설정하기 (맵 버전)
    let numberOfInputLines = 5
    var input_lines = [String]()
    var splits =  [[String]]() //for文の外に
    
    for i in 0..<numberOfInputLines {
        input_lines.append(readLine()!)
        splits.append(input_lines[i].components(separatedBy: " ")) //[["1", "3", "1"], ["3", "2", "2"], ["2", "3", "5"], ["3", "4", "4"], ["1", "6", "6"]]
    }    
    
    let outArray = splits.map { [Int($0[0])!, Int($0[1])!, Int($0[2])!] }
    /*
    2019/1/21 追記
    splitsという配列をつくっていますが、mapを二重で使うと不要です。
    ただちょっと説明しづらいですね。。。
    let outArray = input_lines.map { $0.components(separatedBy: " ").map { Int($0)! } }
    */
    
    print(outArray) //[[1, 3, 1], [3, 2, 2], [2, 3, 5], [3, 4, 4], [1, 6, 6]]
    
    미안합니다. 생각해 봤는데 좋은 샘플이 아니에요.
    paiza의 A 문제를 해결할 때는 이렇게 처리해야 한다.

    맵 해독


    흔히 볼 수 있는 서법
    let outArray = splits.map { [Int($0[0])!, Int($0[1])!, Int($0[2])!] }
    
    그럼, 맵의 작법에 관해서 여러분은 뜻을 아십니까?
    나는 전혀 모른다.
    왜 이해가 안 되는지 알아봤는데 많은 걸 생략해서.
    모두 생략할 필요가 없습니다. 지루하게 쓰면 맵은 다음과 같습니다.
    일부러 벽장 을 전부 생략하고 장황하게 썼다
    let outArray = splits.map({ (element: [String]) -> [Int] in 
        return [Int(element[0])!, Int(element[1])!, Int(element[2])!]
    })
    
    분위기 완전 바뀌었네.
    하지만 하는 일은 똑같다.
    일일이 이렇게 써야 한다면 맵을 쓰지 마세요.
    순환이 끊이지 않아도appeend는 변하지 않을 것이다.
    그럼, 뭘 생략했냐면 하나씩 보세요.

    1. 트레이링 벽장


    먼저 최초의 문법에서
    .map은 분명 함수입니다.맵()을 쓸 괄호가 없네요.

    이것은 트레이 링 벽장이라고 불리는 기법이다
    함수의 마지막 인자가 복제된 경우 () 밖에서 쓸 수 있습니다.
    만약 벽장이 매개 변수라면 지루하고 장황한 문법으로 알 수 있다
    {} 바깥쪽은 () 싸야 합니다. 읽을 수 없습니다.

    2. 근거형 추론의 생략


    옷장에는 매개 변수와 반환값이 있다
    다른 사람이 쓴 코드를 보니 너무 정확하게 쓴 경우가 적은 것 같다.

    원래 맵의 함수 정의는 다음과 같다.
    map의 함수 정의
    func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
    
    Aray형은 맵이라는 방법이 있어요.
    Aray형의 요소들을 옷장에 포함된 형태로 받습니다.
    어떻게 된 일인지 모르게 처리해서 마지막으로 Arreay 형식으로 돌려드리겠습니다. 이것이 바로 맵입니다.

    그림으로 이렇게 처리됐습니다.
    벽장의 매개 변수와 반환값은 추론을 할 수 있기 때문에 생략할 수 있습니다.
    이 경우 스트링형의 1차원 배열을 요소로 수용한다
    Int형의 1차원 배열로 토출되어 최종적으로 [Int]의 2차원 배열이 된다.
    만약 프로그램에서 컴파일러가 형식을 추측할 수 없는 처리를 썼다면 컴파일 오류가 발생할 수 있습니다.

    3. 매개변수 이름 단순화


    지루한 기법이라면 요소라는 매개 변수 이름을 사용하여 배열의 각 요소를 수신합니다.

    옷장은 간소화 파라미터 이름을 사용할 수 있다.
    0달러로 배열된 요소를 표시합니다.
    이것을 사용하면 상술한 요소라는 매개 변수 이름을 생략할 수 있습니다.
    매개변수 이름을 생략한 경우에도 in 키워드를 함께 생략하는 습관이 있는 것 같습니다.

    4. 억제된 return(Implicit Returns)


    많이 생략해도 되는데.
    마지막으로 리턴도 지워.
    문장이 한 문장만 있다면 클론은 계산 결과를 출력으로 되돌려줍니다.
    기본 리턴(Implicit Returns)이라고 합니다.
    이렇게 해석하면 최초의 생략 형식이 어떻게 많은 정보를 생략한 간결한 문법인지 알 수 있다.

    sort 및 fileter


    의외의 맵 설명으로 시간을 낭비했기 때문에.
    애초에 sort랑 Filter도 조사한 결과를 쓰고 싶어요.
    좀 피곤하니까 참고 사이트를 보세요.
    sort나 Filter라면 벽장에 조건을 지정할 수 있습니다.

    함수형 문법에 대한 개인적인 소감


    화제가 돼도하스켈을 쓴 소녀.
    함수형 프로그래밍의 기법을 소개하였다
    확실히 약간의 어려운 처리 방법을 간결하게 쓸 수 있어서 나는 매우 기쁘다.
    그냥 그거예요. 코드만 있는 것 같아요. 예쁘면.
    (언어가 다르다)
    연기가 좋아지지 않을 것 같아요.
    맵/sort/filter를 사용할 수 없어도 제어 파일로 대체할 수 있습니다
    간신히 스위프트로 쓰면 능숙하게 써줬으면 좋겠다.

    사이트 축소판 그림


    애플 공식
    Swift의 맵, Filter, Reduce(등)는 이럴 때 사용합니다!

    좋은 웹페이지 즐겨찾기