2016-12-14 4 views
2

지금 당장 필요합니다.이 요구 사항은 NSPredicate이있는 다른 배열 필터에서 데이터 배열을 사용하는 것입니다. 객체 C에서이 작품을 다음과 같다 : 나는 필터를 얻을 수 있습니다,이 방법으로swift3.0의 NSPredicate로 배열 필터 배열을 원합니다

NSArray * arr1 = @[@1,@2,@3]; 

NSArray * arr2 = @[@2,@3,@4,@5]; 

NSPredicate * filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",arr1]; 

NSArray * filter = [arr2 filteredArrayUsingPredicate:filterPredicate]; 

,이 배열의 T 그는 요소는 내가 스위프트 3.0에 관련된 방법을 찾을 수 없습니다 arr1.But에 포함되지 않습니다 . 모든 도움을 얻을 수 있다면 매우 감사하겠습니다.

+0

가 스위프트의'NSArray'를 사용하는 이유는 거의 결코, 그리고'NSPredicate' 훨씬 간단 디자인으로 교체 할 수 있습니다, 시간 – Alexander

+0

대부분의 번역의 거의 모든 경우와 마찬가지로 (프로그래밍 언어와 인간 모두 언어 **) **는 해당 단어에 대해 각 단어를 바꿔 쓰려고하지 않습니다. 대신 문구의 의미 (의미)를 이해하고 새로운 문구에 가장 잘 맞는 새로운 문구로 번역하십시오. 소스 문구와 반드시 비슷하지는 않지만 훨씬 나은 결과를 산출합니다. – Alexander

답변

3

filter을 사용하면 NSPredicate을 사용할 필요가 없습니다.

let array1 = [1,2,3] 
let array2 = [2,3,4,5] 
let filterArray = array2.filter { !array1.contains($0) } 
print(filterArray) // [4, 5] 

편집 : 당신이 array1으로도 설정 사용하는 경우 @Alexander는 타자를 제안한 것처럼.

let array1 = [1,2,3,2,3] 
let set = Set(array1) 
let array2 = [2,3,4,5] 
let filterArray = array2.filter { !set.contains($0) } 
print(filterArray) 
+1

@chenbo주의 할 점은, 평범하지 않은 배열 크기의 경우, 먼저'array1'을 Set으로 변환하는 것이 더 낫다는 것입니다. 이 O (N^2) 알고리즘을 O (N)로 가속화하여 성능을 대폭 향상시킵니다. – Alexander

+0

@AlexanderMomchliov 좋은 제안이지만'contains'는 반환 할 첫 번째 요소와 일치하고 나머지 요소를 확인하지 않으면'contains'가 더 이상 진행되지 않을 것이라고 생각합니다. –

+0

그렇긴하지만 계산상의 복잡성을 전혀 줄이지는 못합니다. 원하는 요소가 배열의 어느 위치 에나 똑같이있을 가능성이있는 균일 한 분포를 가정하면 평균적으로 절반 정도 (일부는 이전, 나중에는 평균이지만 절반 정도)에 발견됩니다. 그것은'array2.count/2' 검색 연산이고,'array2.count' 번 반복됩니다 ('array2'의 원소 당 하나의 라운드로,'O (array2.count/2 * array2.count)'의 총 시간 복잡성을 얻습니다. 'O (N^2) 그것을위한 ' – Alexander