3

私は次のような配列を持っています:

(
  {
    id=1;
    Title="AAAA";
    period_id=1;
  },
  {
    id=2;
    Title="BBBB";
    period_id=2;
  },
  {
    id=3;
    Title="CCCC";
    period_id=2;
  },
  {
    id=4;
    Title="DDDD";
    period_id=2;
  },
  {
    id=5;
    Title="EEEE";
    period_id=3;
  },
)

質問Period_id=2:配列内に複数回あることをどのように知ることができますか?

これを解決するのを手伝ってください。

ありがとうございました、

4

5 に答える 5

7

そうする方法はたくさんありますが、そのうちのいくつかはここにあります..

A:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"period_id == %@", @"2"];
NSArray *newArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%d", [newArray count]);

B:

NSMutableArray *newArray = [[NSMutableArray alloc] init];
for (id obj in array)
{
    if([obj[@"period_id"] isEqualToString:@"2"]){
        [newArray addObject:obj];
    }
}
NSLog(@"%d", [newArray count]);

子:

NSArray *allIds = [array valueForKey:@"period_id"];
NSCountedSet *set = [[NSCountedSet alloc] initWithArray:allIds];
for (id item in set)
{
    NSLog(@"period_id=%@, Count=%d", item,[set countForObject:item]);
}

D:

NSArray *allIds = [array valueForKey:@"period_id"];
__block NSMutableArray *newArray = [[NSMutableArray alloc] init];
NSString *valueToCheck = @"2";
[allIds enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
   if([obj isEqualToString:valueToCheck])
       [newArray addObject:obj];
}];
NSLog(@"%d", [newArray count]);

E:

NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    return [[obj objectForKey:@"period_id"] isEqualToString:@"2"];
}];
NSArray *newArray = [array objectsAtIndexes:indexes];
NSLog(@"%d", [newArray count]);
于 2013-08-05T06:54:47.730 に答える
1

このようにしてみて、

 NSIndexSet *indices = [questionSections indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
        return [[obj objectForKey:@"period_id"] isEqualToString:@"2"];
    }];
     NSArray *filtered = [questionSections objectsAtIndexes:indices];

    NSLog(@"duplictae:%d\n %@",[indices count],filtered);

O/P:-

duplicate: 3
 (
        {
        name = bbbb;
        "period_id" = 2;
    },
        {
        name = ccccc;
        "period_id" = 2;
    },
        {
        name = ddddd;
        "period_id" = 2;
    }
)
于 2013-08-05T06:07:06.457 に答える
0

NSPredicate重複をチェックするために使用することもできます。

この例を試してください:

NSPredicate *testPredicate = [NSPredicate predicateWithFormat:@"period_id.intValue == %d",value];
NSMutableArray *data = [[NSMutableArray alloc] init];
NSArray *testArray= [yourArray filteredArrayUsingPredicate:testPredicate];
NSLog(@"duplicate:%d",[testArray count]);
于 2013-08-05T06:47:54.977 に答える
0

あなたの場合のように、配列がソートされている場合は、次のアイテムがこれと同じ値を持っているかどうかを確認してください

for(int i = 0; i < array.size() - 1; i++) {
    if (array[i].id == array[i + 1].id) {
        // Duplicate
    }
}

知りたいだけならid = 2

int idCount = 0;
for(int i = 0; i < array.size() - 1; i++) {
    if (array[i].id == 2) {
        idCount++;
    }
}

場所も知りたい場合

int idCount = 0;
int idarr[array.size()];
for(int i = 0; i < array.size() - 1; i++) {
    if (array[i].id == 2) {
        idarr[idCount++] = i;
    }
}
于 2013-08-05T06:08:20.640 に答える
0

これは、私が収集したものからのJSON応答だと思います。はい、period_idを取得できます。すべてのperiod_idを に追加しNSMutableArrayます。

次に、この配列内からperiod_idを検索して、 period_idの値が sameになるようにします。period_idが同じであるインデックスを取得します。

 NSSet *uniqueElements = [NSSet setWithArray:myArray];

for(id element in uniqueElements) {
  // iterate here
}
于 2013-08-05T06:09:05.607 に答える