2014-02-08 2 views
-1

У меня есть этот массив, который имеет пять случайных чисел между 9:59:Добавление объектов алгоритма в Objective-C

NSMutableArray *arrayOfNumbers = [NSMutableArray array]; 
    for (int x = 0; x < 5; x++) 
    { 
     [arrayOfNumbers addObject: [NSNumber numberWithInt: arc4random()%10]]; 
    } 
    NSLog(@"%@",arrayOfNumbers); 

Я хочу взять первые два и последние два объекта и добавить их вместе. Если они добавляют друг к другу, я хочу вернуть 2. Если они не добавляются вместе, я хочу проверить, чтобы второй и третий объекты добавляли последние два объекта. Так что в основном, если у меня есть массив [2,3,9,4,1], то я хочу проверить, есть ли 2 + 3 = 4 + 1. В этом случае да, поэтому я бы вернул 2. В этом массиве [2,3,6,4,5] 2 + 3! = 4 + 5, поэтому мы перейдем на проверку, если 3 + 6 = 4 + 5, а с мы возвращаем 2. Теперь, если нет двух объектов, которые при объединении могут быть равны [0,1,2,3,4], тогда мы будем возвращать -1.

Это то, что я сделал до сих пор:

int lastValue = [arrayOfNumbers count]; 
    int secondlastValue = [arrayOfNumbers count] - 1; 
    int firstValue = 0; 
    int secondValue = 1; 

    int i; 
for (i = 0; i < [arrayOfNumbers count]; i++) { 
    int one = [[arrayOfNumbers objectAtIndex:firstValue + i] integerValue]; 
    int two = [[arrayOfNumbers objectAtIndex:secondValue + i] integerValue]; 
    int secondtolast = [[arrayOfNumbers objectAtIndex:secondlastValue] integerValue]; 
    int last = [[arrayOfNumbers objectAtIndex:lastValue] integerValue]; 

    if (one + two == secondtolast + last) { 
     NSLog(@"2: Because %i + %i = %i + %i",firstValue,secondValue,secondlastValue,lastValue); 
     break; 
    } else { 
     NSLog(@"-1"); 
    } 
} 

Но по какой-то причине, он выходит из строя ... Любая помощь будет оценена. благодаря!

EDIT: это ошибка *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'

EDIT 2: Это мой NSLog-х

if ((one + two) == totalOfLastValues) { 
      NSLog(@"2: Because %@ + %@ (%i) = %@ + %@",arrayOfNumbers[i],arrayOfNumbers[i+1],one+two,[arrayOfNumbers objectAtIndex:[arrayOfNumbers count] - 2],[arrayOfNumbers lastObject]); 
      break; 
     } else { 
      NSLog(@"-1: Because %@ + %@ (%i) != %@ + %@",arrayOfNumbers[i],arrayOfNumbers[i+1],one+two,[arrayOfNumbers objectAtIndex:[arrayOfNumbers count] - 2],[arrayOfNumbers lastObject]); 
     } 
+0

Ваш код выглядит он создает индекс за пределами исключения границ. Почему вы перебираете массив и добавляете i в firstvalue и secondvalue? Вы должны установить точку останова и выполнить свой код, чтобы понять, как он себя ведет. – bneely

ответ

1

Он падает, потому что окончательное значение вещь i указывает на последний элемент в массив. Итак, последняя вещь, которую вы пытаетесь найти, - secondValue+i, которая находится за последний элемент в массиве. Это вызывает исключение.

Аналогичным образом, ваши lastValue и secondLastValue настроены слишком высоко. Первым элементом массива является элемент 0. Поэтому, если есть два элемента, последний элемент - это элемент 1. Если есть n, то последний элемент - n-1.

Итак:

 int lastValue = [arrayOfNumbers count] - 1; 
     int secondlastValue = [arrayOfNumbers count] - 2; 
     int firstValue = 0; 
     int secondValue = 1; 

     int i; 
    for (i = 0; i < [arrayOfNumbers count]-1; i++) { 
     int one = [[arrayOfNumbers objectAtIndex:firstValue + i] integerValue]; 
     int two = [[arrayOfNumbers objectAtIndex:secondValue + i] integerValue]; 
     int secondtolast = [[arrayOfNumbers objectAtIndex:secondlastValue] integerValue]; 
     int last = [[arrayOfNumbers objectAtIndex:lastValue] integerValue]; 

     if (one + two == secondtolast + last) { 
      NSLog(@"2: Because %i + %i = %i + %i",firstValue,secondValue,secondlastValue,lastValue); 
      break; 
     } else { 
      NSLog(@"-1"); 
     } 
    } 

EDIT: Вы также хотите, чтобы не рассматривать ли суммироваться две последние цифры равны последние два числа суммируются. В противном случае вы всегда будете возвращать 2. Также нет смысла делать эту часть арифметики внутри цикла. Таким образом, первая neatened версия может выглядеть следующим образом:

for (int x = 0; x < 5; x++) 
    { 
     [arrayOfNumbers addObject: @(arc4random_uniform(10))]; 
    } 
    NSLog(@"%@",arrayOfNumbers); 

    int lastValue = [[arrayOfNumbers lastObject] integerValue]; 
    int secondLastValue = [[arrayOfNumbers objectAtIndex:[arrayOfNumbers count] - 2] integerValue]; 
    int totalOfLastValues = lastValue + secondLastValue; 
    int firstValue = 0; 
    int secondValue = 1; 

     int i; 
    for (i = 0; i < [arrayOfNumbers count]-3; i++) { 
     int one = [[arrayOfNumbers objectAtIndex:firstValue + i] integerValue]; 
     int two = [[arrayOfNumbers objectAtIndex:secondValue + i] integerValue]; 

     if ((one + two) == totalOfLastValues) { 
      NSLog(@"2: Because %i + %i (%i) = %i",firstValue+i,secondValue+i,one+two,totalOfLastValues); 
      break; 
     } else { 
      NSLog(@"-1"); 
     } 
    } 

Очистка и предотвращение повторяющихся вызовов integerValue приводит к:

int lastValue = [[arrayOfNumbers lastObject] integerValue]; 
    int secondLastValue = [[arrayOfNumbers objectAtIndex:[arrayOfNumbers count] - 2] integerValue]; 
    int totalOfLastValues = lastValue + secondLastValue; 

    int mostRecentValue = [arrayOfNumbers[0] integerValue]; 
    for (int i = 1; i < [arrayOfNumbers count]-3; i++) { 
     int one = mostRecentValue; 
     int two = [arrayOfNumbers[i] integerValue]; 
     mostRecentValue = two; 

     if ((one + two) == totalOfLastValues) { 
      NSLog(@"2: Because %i + %i (%i) = %i",i,i+1,one+two,totalOfLastValues); 
      break; 
     } else { 
      NSLog(@"-1"); 
     } 
    } 
+0

Это работает, но NSLog возвращается массив '( 5, 6, 6, 9, )' , а затем возвращается '-1' два раза и, наконец,' 2: Поскольку 0 + 1 = 3 + 4' –

+0

В этом случае добавляются индексы 2 и 3, чтобы получить то же, что и индексы 3 и 4 - '6 + 9 = 9 + 6'. В моем редактировании я ограничил верхний предел на 'i', чтобы этого избежать. – Tommy

+0

hmm ..массив был '( 3, 6, 0, 6,)' но как-то по-прежнему NSLogged '-1' три раза, а затем' 2: Из 3 + 4 (11) = 11' несмотря на то, 3 и 4 даже не находятся в массиве –

Смежные вопросы