2012-05-15 3 views
2

사과와 함께이 질문을 시작하겠습니다. 저는 Objective C를 처음 접해 보았습니다. 유감스럽게도, 저는 작업을위한 프로젝트에 대해 매우 긴밀한 타임 라인을 가지고 있으며 가능한 한 빨리 속도를 높여야합니다.Objective-C에서 배열을 처리하는 더 나은 방법은 무엇입니까?

아래 코드가 작동합니다. 나는 이것을 처리하는 더 좋은 방법이 있는지 궁금 할 것입니다 ... 아마 더 많은 코코아 틱일지도 모릅니다. 이 함수의 모든 목적은 특정 값을 갖는 문자열에서 정렬 된 위치 목록을 얻는 것입니다.

나는 안락을 이유로 표준 배열에 넘어졌다. 처음에 선언 한 NSMutableString은 테스트 목적으로 만 사용됩니다. 이 언어에 대한 완전한 멍청한 탓에 여전히 Objective C (그리고 C++에서 추측하는) 변수와 포인터를 처리하는 방법에 대해 머리를 감싸는 것으로, 모든 힌트, 팁, 포인터를 이해할 수 있습니다.

NSMutableString *mut = [[NSMutableString alloc] initWithString:@"This is a test of the emergency broadcast system. This is only a test."]; 

NSMutableArray *tList = [NSMutableArray arrayWithArray:[mut componentsSeparatedByString:@" "]]; 

int dump[(tList.count-1)]; 
int dpCount=0; 
NSUInteger length = [mut length]; 
NSRange myRange = NSMakeRange(0, length); 

while (myRange.location != NSNotFound) { 

    myRange = [mut rangeOfString:@" " options: 0 range:myRange]; 

    if (myRange.location != NSNotFound) { 
     dump[dpCount]=myRange.location; 
     ++dpCount; 
     myRange = NSMakeRange((myRange.location+myRange.length), (length - (myRange.location+myRange.length))); 
    } 
} 

for (int i=0; i < dpCount; ++i) { 
    //Going to do something with these values in the future... they MUST be in order. 
    NSLog(@"Dumping positions in order: %i",dump[i]); 
} 
text2.text = mut; 
[mut release]; 

답장을 보내 주셔서 다시 한 번 감사드립니다.

+0

이 세이건, 일반적으로 스택 오버플로가 의미하지 않는다 여기에 한 가지 방법입니다 코드 검토 등을 제공합니다. 특정 답변이있는 질문을 의미합니다. 자세한 정보는 [FAQ] (http://stackoverflow.com/faq)에서 확인하십시오. 일반적으로, 일부 가이드는 이런 종류의 물건을 이해하는 데 유용 할 것이라고 생각합니다. 당신을 도울 훌륭한 책과 온라인 자원이 있습니다. 나는 현재 코드에 중요한 이슈를 볼 수 없으므로 조심할만한 것이 없을 수도 있습니다. –

+0

포인트를 가져갔습니다 ... 낭비되는 질문에 사과드립니다. 내가 거기에 명백한 것을 놓치고있는 것처럼 보였다. 나는 단지 "내게 왜이 일을하지 않는가?"라는 글을 올리려고 노력할 것입니다. 미래의 질문. 시간 내 주셔서 다시 한번 감사드립니다. – Sagan

+0

함수가 더 정확하게 설명 할 수 있습니까? 단어를'tList'로 분리하지만'tList'를 사용하지 않으면, 단지 공백 문자의 모든 위치를 찾는 문자열을 반복하고있는 것 같습니까? – dreamlax

답변

1

당신이하려는 일을하는 좋은 방법이 없습니다. (그 중요한 경우, 실행 시간의 측면에서 빠르게)

// locations will be an NSArray of NSNumbers -- 
// each NSNumber containing one location of the substring): 
NSMutableArray *locations = [NSMutableArray new]; 
NSRange searchRange = NSMakeRange(0,string.length); 
NSRange foundRange; 
while (searchRange.location < string.length) { 
    searchRange.length = string.length-searchRange.location; 
    foundRange = [string rangeOfString:substring options:nil range:searchRange]; 
    if(foundRange.location == NSNotFound) break; 
    [locations addObject:[NSNumber numberWithInt:searchRange.location]]; 
    searchRange.location = foundRange.location+foundRange.length; 
} 
+0

감사합니다. 어떤 이유로 든 NSNumber에 위치 속성을 쑤셔 넣을 수 없기 때문에 표준 배열로 된 모든 이유가 ... 포인터 오류를 계속 발생 시켰습니다. 당신의 방법은 효과가 있었고 나중에 열거 할 수있었습니다. – Sagan

1

이 좀 더 간소화 할 수 있습니다 :

이 이 이
const char *p = "This is a test of the emergency broadcast system. This is only a test."; 
NSMutableArray *positions = [NSMutableArray array]; 

for (int i = 0; *p; p++, i++) 
{ 
    if (*p == ' ') { 
     [positions addObject:[NSNumber numberWithInt:i]]; 
    } 
} 

for (int j = 0; j < [positions count]; j++) { 
    NSLog(@"position %d: %@", j + 1, [positions objectAtIndex:j]); 
} 
+0

삼항 연산자가 필요하지 않습니다. "i가 0이면 배열에 0을 넣고, 그렇지 않으면'i'가 0이 아니고'i'를 배열에 넣습니다. – dreamlax

+0

고맙습니다. 우아한 찾고 솔루션입니다. C++에서 한발 뒤로 물러나고 충돌 코스를 가져갈 필요가있는 것처럼 보입니다. – Sagan

+0

@dreamlax - Doh! 게시하기 전에 솔루션 코드를 수정하고 제거하는 것을 잊었습니다. 고마워, 나는 대답을 업데이 트합니다. – jlehr

관련 문제