2012-02-27 5 views
0

Car 클래스가 있습니다. enginePower라는 속성이 있습니다. 반면에 나는 50 개가 넘는 자동차 객체를 포함하는 NSArray를 가지고있다. 나는 어떻게 주어진 가치보다 적은 동시에 가장 높은 엔진 파워를 가진 차를 선택할 것인가? 더 명확하게하려면 : 이제Objective-C- 가장 큰 속성 값을 가진 객체 가져 오기

BMW X5-345 hp 
Audi A3-200 hp 
BMW 525i -225 hp 
VW Passat CC-175 hp 
..... 

, 자동차의 배열에서 나는 그것이 BMW의 525i 저를 주어야한다 미만 (320) 가장 높은 enginePower와 차를 요청하는 경우. 그것을 성취 할 수 있습니까? 멋지고 쉬운 방법이 있을까요? 아니면 많은 코드 라인이 필요합니까?

+2

봐 (https://developer.apple.com/library/mac/검색 /? q = nspredicate). –

답변

4

당신이 같은 시도 할 수 있습니다 통해 루프 코드를 작성하지 않도록하려면 @Jasarien 제공하는 대답은 잘 작동하지만 것이다 : 자동차에서만 찾고, 배열을

- (Car *)getHighestPowerFromCars:(NSArray *)carArray atLeast:(NSNumber *)minPower { 
    NSArray *descriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"enginePower" ascending:NO]]; 
    NSArray *sortedArray = [carArray sortedArrayUsingDescriptors:descriptors]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"enginePower >= %@", minPower]; 
    NSArray *filteredArray = [sortedArray filteredArrayUsingPredicate:predicate]; 
    return [filteredArray objectAtIndex:0]; 
} 
+0

훨씬 더 좋은 해결책 : P – Jasarien

1

엔진 성능 속성을 사용하여 배열을 정렬 한 다음 지정한 값보다 큰 enginePower 값이 나타날 때까지 배열을 반복합니다. 그런 다음 객체의 값을 currentArrayIndex - 1으로 가져옵니다.

당신은 NSArray (반환하는 새, 분류, 오토 릴리즈 배열)에 NSMutableArray 또는 -sortedArrayUsingSelector:-compareUsingSelector:를 사용하여이 작업을 수행 할 수 있습니다.

Car 클래스에서 과 같은 이름의 메서드를 만들면 Car 개체가 매개 변수로 사용됩니다.

그런 다음 두 개의 enginePower 속성을 비교하여 NSOrderedSame, NSOrderedAscending 또는 NSOrderedDescending 중 하나를 반환 할 수 있습니다.

+0

그것은 모든 차를 순서대로 분류하는 것처럼 보이지만, OP는 공칭 값보다 적은 전력을 가진 자동차의 하위 집합에서 차를 선택하려고합니다. –

+0

오, 나는 그 비트를 놓쳤다 .../ – Jasarien

+0

고정 ... 나는 이제부터 더 신중하게 질문을 읽을 것이다. – Jasarien

-1

솔직한 반복을 전원 한계 이하, 가장 높은 힘을 가진 하나 따기 :

— (Car *)getHighestPowerFromCars:(NSArray *)carArray lessThan:(NSNumber *)maxPower 
{ 
    NSNumber* highest = nil; 
    Car* highestCar = nil; 

    for (Car* car in carArray) 
    { 
     NSNumber* power = car.enginePower; 
     if ([power compare:maxPower] == NSOrderedAscending]) 
     { 
      if (highest == nil || [power compare:highest] == NSOrderedDescending]) 
      { 
       highest = power; 
       highestCar = car; 
      } 
     } 
    } 

    return highestCar; 
} 

을하지만 enginePower가의 NSNumber하고, 예를 들어 이중 안 정말 어떤 이유가 없습니다. 전원이 부정적인 결코 없다고 가정 : [`NSPredicate`]에서 ...

— (Car *)getHighestPowerFromCars:(NSArray *)carArray lessThan:(double)maxPower 
{ 
    double highestPower = -1.0; 
    Car* highestCar = nil; 

    for (Car* car in carArray) 
    { 
     double power = car.enginePower; 

     if (power < maxPower && power > highestPower)) 
     { 
      highestPower = power; 
      highestCar = car; 
     } 
    } 

    return highestCar; 
} 

을하지만 정렬 및 조건이 soooo는 빨리

+0

마이크로 및 조기 최적화가 아닌 제공된 도구«똑 바른»를 사용하여 전화하겠습니다. – vikingosegundo

관련 문제