Sort, filter in action
swift
71
ios
55
White

VietHQ viết ngày 03/07/2017

Back to basic

Hồi học phổ thông, tôi rất ấn tượng với một thằng giải toán bằng định nghĩa. Hắn học chuyên toán tự nhiên, ngồi trên tôi một bàn, quả thực không khó để tôi liếc được bài :D. Một cách giải thật đặc biệt, xuất phát từ định nghĩa cơ bản, trong khi cách giải thông thường là dùng công thức. Về sau, khi làm lập trình, tôi càng thấm thía hơn những cách làm đơn giản kiểu như vậy.

Có thể nói, những kĩ thuật đơn giản, chúng ta hay bỏ quên, đôi khi lại đưa ra một cách giải hay, độc đáo. Hôm nay, tôi sẽ "back to basic" để xem lại các hướng giải quyết việc filtersort trong Array.

Filter

Giả sử ta có một mảng

let listStr = ["quoc anh", "Hoang hai", "hoàng giang","anh ngoc", "quoc nguyen"]

Ta cần lọc ra những phần tử có chứa từ "hoang". Ta có thể sử dụng những cách sau.

  • Sử dụng NSPredicate

Trường hợp ta không phân biệt chữ hoa chữ thường ta có thể làm như sau

let filterC = NSPredicate(format: "self contains[c] %@", "hoang")
let arrFilterC = (listStr as NSArray).filtered(using: filterC) // ["Hoang hai"]

Trường hợp ta không phân biệt dấu

let filterD = NSPredicate(format: "self contains[d] %@", "hoang")
let arrFilterD = (listStr as NSArray).filtered(using: filterD) // ["hoàng giang"]

Nếu không cần phân biệt cả viết hoa, thường, cả dấu, ta có thể kết hợp điều kiện

let filterD = NSPredicate(format: "self contains[cd] %@", "hoang")

Về query format của NSPredicate, mọi người tham khảo thêm tại đây.

  • Sử dụng hàm filter của swift

Cách trên là kế thừa di sản từ ObjC, bây giờ chúng ta sử dụng cách khác, gọn hơn và clear hơn.

Không phân biệt chữ hoa, chữ thường

let filterStrC = listStr.filter { $0.range(of: "hoang", options: .caseInsensitive, range: nil, locale: nil) != nil }

Ngắn hơn có thể dùng cách sau

let arrFilter = listStr.filter { $0.localizedCaseInsensitiveContains("hoang")}

Không phân biệt dấu

let filterStrD = listStr.filter { $0.range(of: "hoang", options: .diacriticInsensitive, range: nil, locale: nil) != nil }

Sort (theo Alphabet)

  • Sử dụng ComparisonResult

Trường hợp không phân biệt chữ hoa, chữ thường (Theo mã ascii)

let arrPre = (listStr as NSArray).sortedArray(comparator: { (s1 ,s2) -> ComparisonResult in
    if let x = s1 as? String, let y = s2 as? String {
        return y.localizedCaseInsensitiveCompare(x)
    }

    return ComparisonResult.orderedAscending
})

Kết quả nhận được như sau

["quoc nguyen", "quoc anh", "Hoang hai", "hoàng giang", "anh ngoc"]

  • Sử dụng NSSortDescriptor
let sortDes = NSSortDescriptor(key: nil, ascending: false, selector: #selector(NSString.localizedCaseInsensitiveCompare))
let arrPre2 = (listStr as NSArray).sortedArray(using: [sortDes])

Kết quả cũng ra tương tự như trên

  • Sử dụng hàm sorted của swift
let sortSimple = listStr.sorted {
    $1.localizedCaseInsensitiveCompare($0) == .orderedAscending
}

Kết

Tóm lại bằng một câu mà ai cũng biết :D

Keep it simple

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

VietHQ

13 bài viết.
5 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 0
Giới thiệu Callback là kĩ thuật được ưa chuộng trong lập trình hiện nay. Ngặt nỗi, nếu sử dụng không khéo rất dễ xảy ra callback hell. Dưới con mắ...
VietHQ viết 2 tháng trước
7 0
White
5 1
Thời gian đầu làm việc với objc mình khá băn khoăn trong việc sử dụng các thuộc tính trong property như strong, weak, copy, assign. Nhân lúc rảnh r...
VietHQ viết hơn 3 năm trước
5 1
White
5 0
1. Giới thiệu Từ hồi mới bắt đầu làm IOS, thằng nào cũng hỏi mình có biết sử dụng AFNetworking không? Khổ nỗi lúc đó, mình mới chuyển từ làm game ...
VietHQ viết hơn 1 năm trước
5 0
Bài viết liên quan
White
11 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 3 năm trước
11 4
White
2 3
Xin chào mọi người. Mình xin chia sẽ một UILabel Helper nhỏ dùng trong truờng hợp cần tính chiều cao của UILabel để xác định "Show More" button có ...
DonDinh viết hơn 3 năm trước
2 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
13 bài viết.
5 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!