2013-04-26 3 views
3

정렬 된 배열에서 중복을 제거하려고합니다 ... 다른 질문에서 예제를 사용하여 수행 할 수 있다고 생각했지만 작동에 가까이 오지 않았습니다.NSMutable 배열에서 중복 된 valuse를 제거합니다

꽤 끔찍한 시도지만 NSMutableArray에서 단일 항목 (NSDictionary)의 두 요소를 비교하는 방법을 알아낼 수있는 유일한 방법입니다. 여기

누군가가 당신이 할 수 있다면 난 후 나는 무엇을 그 고유 항목의있는 NSArray를 만드는 방법에 대한 아이디어를 가지고 있다면 현재 정렬 된 배열

NSArray *duplicatesRemovedArray = [sortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSDictionary *dictA = a; 
     NSDictionary *dictB = b; 

     NSString *startYear1 = dictA[kStartYear]; 
     NSString *finishYear1 = dictA[kFinishYear]; 
     NSString *allYear1 = [NSString stringWithFormat:@"%@%@",startYear1, finishYear1]; 
     NSString *startYear2 = dictB[kStartYear]; 
     NSString *finishYear2 = dictB[kFinishYear]; 
     NSString *allYear2 = [NSString stringWithFormat:@"%@%@",startYear2, finishYear2]; 

     return [allYear1 compare:allYear2]; 

    }]; 

이 내 코드 예제

입니다 나에게 어떤 제안을 크게 감상 할 수있다 코드 예제

업데이트 : 나는 ...

내있는 NSDictionary가 내에서 ID를 다른 요소가 있음을 지적한다

예를 들어 나열된 예제와 같은 객체를 비교할 수는 없습니다 ... 이것은 내 부분에 대한 감독이었습니다. 그래서 effectivly 객체는 StartYear 및 FinishYear 일치하는 다른 개체가 마무리 년 시작 whos는 내가 객체를 제거 도움이 필요이

ID: 1234 
STARTYEAR: 1999 
FINISHYEAR: 2000 

처럼 보인다.

+1

중복 가능성 : // 유래 .com/questions/1025674/the-best-way-to-remove-duplicate-values-nsmutablearray-in-objective-c), http://stackoverflow.com/questions/3966592/removing-duplicates-in- nsarray, http://stackoverflow.com/questions/3882515/remove-duplicates-nsmutablearray, http://stackoverflow.com/questions/5978574/removing-duplicates-from-nsmutablearray, [others] (https : // www .google.com/search? q = site : stackoverflow.com + remove + duplicates + nsa rray). –

+0

@ JoshCaswell 내가 문제가되는 비트는 각각의 NSDictionary 객체에 두 개의 요소가 있다는 사실입니다. 그 사실을 근거로 메서드를 기반으로해야합니다. 모든 예제가 단일 요소를 사용하여 배열을 표시하는 것이 가장 좋습니다. 개체 당 두 개의 날짜 값을 확인하는 대신 하나의 날짜 값 –

답변

7

그래서 정확하게 질문을 이해한다면 동일한 연도 값 (그러나 다른 ID)을 가진 항목이 두 개 이상있는 경우 그 중 하나만 결과에 포함되는 방식으로 배열을 필터링하고 싶습니다.

간단한 방법은 배열을 반복하면서 변경 가능한 세트에서 이미 본 시작/종료 연도를 수집하고 시작/완료 조합이있는 경우 결과에 항목 만 포함하는 것입니다 당신이 아직 추가하지 않은 년. 이 예에서

NSArray *array = @[@{@"ID": @(1234), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2001)}, 
        @{@"ID": @(1235), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2001)}, 
        @{@"ID": @(1236), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2000)}, 
        @{@"ID": @(1237), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2000)}]; 

NSMutableArray *duplicatesRemoved = [NSMutableArray array]; 
NSMutableSet *seenYears = [NSMutableSet set]; 
for (NSDictionary *item in array) { 
    //Extract the part of the dictionary that you want to be unique: 
    NSDictionary *yearDict = [item dictionaryWithValuesForKeys:@[@"STARTYEAR", @"FINISHYEAR"]]; 
    if ([seenYears containsObject:yearDict]) { 
     continue; 
    } 
    [seenYears addObject:yearDict]; 
    [duplicatesRemoved addObject:item]; 
} 
NSLog(@"%@", duplicatesRemoved); 

,이 두 항목을 초래할 것이다 :

{ FINISHYEAR = 2001; ID = 1234; STARTYEAR = 1999; } 
{ FINISHYEAR = 2000; ID = 1236; STARTYEAR = 1999; } 
(HTTP [오브젝티브 C에있는 NSMutableArray 중복 값을 제거하는 가장 좋은 방법 η]
+0

네, 그게 정확히 내가 이뤄내려고하는 것입니다. 나는 당신의 대답을 지금 시도하고 당신에게 내가 어떻게되는지 알려줄 것입니다. –

+0

거룩한 몰리 .. 효과가있었습니다. 남자 나는이 문제에 대해 여러 번 생각 해왔다. 어느 시점에서 나는 그것을 이해하고 해결하거나 누군가가 내가 무엇을 묻고 도와 주 었는지 이해할 것이기를 바랐다. .. 너를 너무 많이 고맙다 .... 나는 훌륭한 고맙습니다. 당신의 도움 .. 오 남자 .. 내 방식으로 그 문제를 가지고있어 너무 기분이 좋다 ... 고마워! –

1

배열의 항목 순서를 유지하는 데 신경 쓰지 않는다면 배열의 개체를 구분할 수있는 빠르고 쉬운 방법은 배열을 집합으로 변환 한 다음 다시 배열로 변환하는 것입니다. 세트의 요소는 구별되고 정렬되지 않습니다. 마찬가지로 상기에서 보이는

NSArray *a = @[@"a", @"b", @"a", @"c", [NSString stringWithFormat:@"%@", @"a"]]; 
NSLog(@"a is: %@", a); 
NSSet *s = [NSSet setWithArray:a]; 
NSArray *b = [s allObjects]; 
NSLog(@"b is: %@", s); 

출력 :

여기 일례이다

a is: (
    a, 
    b, 
    a, 
    c, 
    a 
) 
b is: {(
    b, 
    c, 
    a 
)} 

그래서, ba는 모든 별개의 개체를 포함하는 어레이이다. 같은 일을하는 짧은 버전입니다 :

NSArray *a = @[@"a", @"b", @"a", @"c", [NSString stringWithFormat:@"%@", @"a"]]; 
NSArray *b = [[NSSet setWithArray:a] allObjects]; 

당신이 당신은 두 가지 선택이 순서에 대해 관리를 할 경우 위의 방법을 사용하고 이후에 객체의 순서를 변경하거나 다른 방법을 사용합니다. 객체를 정렬 된 상태로 유지하려는 경우 물론 결과 객체 배열을 정렬하여 정렬 된 순서를 복원 할 수 있습니다. 또는 배열이 정렬 된 경우 정렬을 통해 중복 객체가 서로 인접하게됩니다. 따라서 각 요소를 후속 요소와 비교하는 배열을 스캔하고 첫 번째 요소가 동일한 경우 제거하십시오.

계산할 수없는 순서를 유지해야하는 경우 다소 혼란 스럽습니다. 배열을 복사하고 위의 방법을 복사본에 적용한 다음 원본 배열을 사용하여 원래 순서를 복원 할 수 있습니다.

나는이 좀 더 복잡하지만별로 StartYear 및 FinishYear 일치

whos는 객체를 제거하는 도움이 필요합니다. 위에서 언급 한 정렬을 통해 중복을 제거하는 방법을 고려하십시오.startYearfinishYear을 키로 사용하여 사전 배열을 정렬하는 경우 동일한 시작 및 끝나는 연도를 가진 개체가 인접 해있는 배열을 가져와야합니다. 즉, 같은 시작 연도의 모든 개체가 함께 클러스터링되며 각 클러스터 내에서 동일한 종료 연도를 가진 모든 개체가 함께 클러스터됩니다. -sortedArrayUsingDescriptors:을 사용하면 쉽게 정렬 할 수 있습니다. 여기에 대한 설명은 다음과 같습니다.

그런 다음, 위에서 설명한대로 진행하십시오. 각 항목을 후속 항목과 비교하여 배열을 스캔하십시오. 그들이 동일하면 아무것도하지 마십시오. 서로 다르거 나 배열의 끝에 도달하면 요소를 새 배열에 복사하거나 인덱스 세트에 인덱스를 추가하십시오. 같은 배열을 스캔 할 때 수정하는 것이 버그를 만드는 쉬운 방법이라는 것을 명심하십시오 (열거 자나 빠른 열거 형을 사용하는 경우 배열을 수정하면 안됩니다). 그래서 새 항목에 고유 항목을 복사하는 것이 좋습니다.

+0

개체를 전체적으로 서로 비교할 수있는 독서를 마쳤습니다. 원래 의도하지 않은 질문은 무시되었습니다. NSDictionary의 또 다른 요소는 startYear finishYear를 기반으로 중복 제거에 아무런 영향이 없다고 생각하는 것입니다. 답변을 제출하기 전에 문자 그대로 1 ~ 2 분 정도의 비슷한 솔루션을 제공 한 것 같습니다. 내 질문을 업데이트했습니다. 내 NSDictionary ..에서 고유 한 요소 값을 가지고 얼굴을 정의하는 –

+0

와 .. .. 방금 thew로 놀아왔다 코드 .. 나는 당신의 업데이트를 보지 못했습니다 .. 지금 읽을 것입니다 :) –

+0

젠장 !!! 귀하의 견적 "나는 Startyear 및 FinishYear 일치 whos 개체를 제거하는 데 도움이 필요합니다"하지만 내 말씨는 완전히 틀린 .... 사실은 내가 읽어야 할 사실 이었어 개체 whos 시작을 제거하고 싶습니다 다른 개체와 일치하는 마무리 배열에. 다시 말하면 배열의 각 객체는 서로 비교되므로 결국 배열의 고유 한 시작일 종결 객체가있는 객체의 배열을 갖게됩니다. –

관련 문제