1

2つの配列を比較し、新しいオブジェクトをいつ作成するかを知るために、ここにある手順を実行しようとしていますが、それがどのように機能するかがわかりません。

最終的に2つのソートされた配列になります。1つはフェッチ要求に渡された従業員IDを持ち、もう1つはそれらに一致する管理対象オブジェクトを持ちます。それらを処理するには、次の手順に従ってソートされたリストをたどります。

Get the next ID and Employee. If the ID doesn't match the Employee ID, create a new Employee for that ID.
Get the next Employee: if the IDs match, move to the next ID and Employee.

渡すIDの数に関係なく、1回のフェッチのみを実行し、残りは結果セットをたどるだけです。

基本的に何が起こっているのかというと、外部ソースからのオブジェクトIDの配列があり、クライアントシステムにはこれらのIDで表されるオブジェクトのサブセットしかありません。すでに持っているオブジェクトを把握する必要があります。持っていない場合は、1つずつ作成します。

これがどのように機能するのかわかりません。これをコードに変換するのに問題があります:

for (int i =0;i<ids.count;i++) {
    currentId = [ids objectAtIndex:i];
    currentObject = [objects objectAtIndex:i];

    if(currentObject.id != currentId) {
        //create new object
    }

    //"get the next employee"
    //uh what?
    nextEmployee = [objects objectAtIndex:i+1]; //?
    if(nextEmployee.id == currentId) {
        //"move on to the next id"
        continue;
    }
}

それがどのように機能するかわかりませんか?私は何が欠けていますか?

4

4 に答える 4

1

Core Data Programming Guideで同じ例を見た後、この質問を見つけました。

これが私の解決策です:

重要なのは、2つの配列を別々に歩いていることです。一方の配列には、Core Dataに存在する必要のあるすべてのemployeeId文字列が含まれ、もう一方の配列には、employeeId文字列でフィルタリングされたCoreDataにすでに存在するEmployeeオブジェクトが含まれます。両方の配列がソートされています。

したがって、文字列を含むソートされたemployeeIds配列があるとしましょう。

@"10",@"11",@"12",@"15",@"20"

そして、employeeId10と15を持つ2つのEmployeeオブジェクトを含むmatchingEmployees配列があること。

従業員ID11、12、および20を持つ従業員の新しい従業員オブジェクトを作成する必要がありますが、従業員10および15の属性を更新する可能性があります。それで:

int i = 0; // employeeIds array index
int j = 0; // matchingEmployees array index

while ((i < [employeeIds count]) && (j <= [matchingEmployees count])){

  NSString *employeeId = [employeeIds objectAtIndex:i];

  Employee *employee = nil;

  if ([matchingEmployees count]!=0)
      employee = [matchingEmployees objectAtIndex:j];

  if (![employeeId isEqualToString:employee.employeeId]){

      employee = //Insert new Employee entity into context
      employee.employeeId = employeeId;

      //Set any attributes for employee that do not change
  }
  else {
      //We matched employeeId to Employee so the next iteration
      //of this loop should check the next Employee object
      j++; 
  }

  //Set any attributes for employee that change with each update

  i++;
}
于 2012-09-25T22:03:31.497 に答える
0

オブジェクト配列で線形検索を実行して、それが見つかるかどうかを確認する必要があります。おそらく次のようなものです。

for (int i = 0; i < ids.count; i++) {
    bool found = NO;
    currentId = [ids objectAtIndex:i];

    // We need to traverse the whole array to check if we can find the objectID somewhere...
    for(int j = 0; j < objects.count; j++) {
        currentObject = [objects objectAtIndex:j];

        if (currentId == currentObject) {
            found = YES;
            break;
        }
    }

    if (!found)
    {
        // Create the new object
    }
}
于 2012-06-25T03:37:30.843 に答える
0

このようなもの:

NSArray *wholeList = [[NSArray alloc]initWithObjects:@"employee1", @"employee2", @"employee3", @"employee4", @"employee5",@"employee6", nil];
NSArray *partialList = [[NSArray alloc]initWithObjects:@"employee2", @"employee13", @"employee7", nil];

for (id employeeID in partialList)  //get one employee from the partialList
{
    if (![wholeList containsObject:employeeID])  //check to see if it is in the wholeList
    {
        NSLog(@"This employee is not in the wholeList: %@", employeeID);
        // do create new employee object for this employeeID, whatever...
    }
}
于 2012-06-25T03:38:43.653 に答える
0

次のようなものを試してください。

//Employee.h
@property (nonatomic) NSInteger ID;
@property (nonatomic, strong) NSString *name;

//Employee.m
@synthesize ID, name;



//Place where you put algorithm
#import "Employee.h"
------------------------
NSMutableArray *employeeIDs = [NSArray arrayWithObjects:[NSNumber numberWithInt:123], [NSNumber numberWithInt:456], [NSNumber numberWithInt:789], nil];

//Creates employee objects
Employee *employee1 = [[Employee alloc] init];
employee1.ID = 123;
employee1.name = @"John Smith";

Employee *employee2 = [[Employee alloc] init];
employee2.ID = 456;
employee2.name = @"Bob Day";

Employee *employee3 = [[Employee alloc] init];
employee3.ID = 789;
employee3.name = @"Steve Jobs";

NSMutableArray *employeesArray = [NSArray arrayWithObjects:employee1, employee2, employee3, nil];

for (int index = 0; index <= [employeeIDs count]; index++) {

    for(id currentEmployee in employeesArray){

        if(currentEmployee.ID != currentID){

            Employee *newEmployee = [[Employee alloc] init];
            newEmployee.name = [NSString stringWithFormat:@"Employee Name"];
            newEmployee.ID = 384;

            [employeeIDs addObject:[NSNumber numberWithInteger:newEmployee.ID]];
            [employees addObject:newEmployee.name];

        }
    }
}

お役に立てれば!

于 2012-06-25T03:49:57.020 に答える