2012-12-28 3 views
0

내 응용 프로그램에 형식의 시간을 나타내는 NSString이 있습니다. "가장 빠른 시간"목록을 생성하려고하는데이 숫자를 정렬하는 데 사용할 데이터 유형을 알아 내려고 애 쓰고 있습니다.특정 형식의 번호 인 NSString을 정렬합니다 (예 3 : 23.123)?

이 문자열을 가장 짧은 시간에서 가장 길게 순서를 지정하는 가장 쉬운 방법은 무엇입니까? 내가 번호 매기기 데이터 형식으로 변환 트릭을 ​​할 것이라고 가정하지만, 어떤 데이터 형식을 사용해야합니까? 형식을 유지해야합니다.

+0

가정 SSS는 마이크로 초를 나타내며, 전체 값을 마이크로 초로 변환하지 않는 것이 좋습니다. – Till

답변

1

당신은 또한 (학대?)를 사용할 수 있습니다 localizedStandardCompare:를 그 목적을 위해, 그 방법은 자신의 수치에 따라 문자열에 포함 된 숫자를 비교하기 때문에 :

NSArray *times = @[ @"11:22.333", @"2:44.555" ]; 
NSArray *sortedTimes = [times sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 
NSLog(@"%@", sortedTimes); 

출력 :

(
    "2:44.555", 
    "11:22.333" 
) 
+0

감사합니다 !! 이것은 내가해야 할 것이라고 생각했던 것보다 훨씬 적은 코드로 트릭을 만들었다. : D – user990769

+0

@ user990769 : 환영합니다! –

2

당신이 NSString 목적이있는 경우 (당신은, 예를 들어, 오프셋 적절한를 사용하여 ISO 8601 형식으로 변환 할 수 있습니다 아마도 이와 같은,) NSDate 객체로 변환 할 수 있습니다, 당신은 NSDate 객체의 NSArray 인스턴스를 정렬 할 수 있습니다 매우 쉽게 (example) 내림차순 또는 오름차순 정렬 여부에 따라 목록의 상단 또는 하단에서 선택하십시오.

이 방법의 장점은 표준 날짜 처리 기능으로 작업하고있어 코드가 적어지고 디버깅이 줄어들 수 있다는 것입니다. 휠을 재 활성화하면 더 빠른 솔루션을 얻을 수 있지만 버그가 발생할 수도 있습니다.

+0

NSDate를 사용하여 보았지만 서식을 시도 할 때 UITextField에 입력 된 시간과 함께 오늘 날짜가 표시됩니다. 나는 해결책을 찾겠다. 그러나 여분의 날짜 데이터를 어떻게 억압 할 수 있는지 아는가? 미리 감사드립니다. – user990769

0

제 조언은 mm, ss 및 SSS에 대한 데이터 유형을 나타내는 고유 한 클래스를 만드는 것입니다. 그런 다음 자신의 prettyprint를 작성하고 데이터 유형에 대한 메소드를 비교할 수 있습니다. compare 메소드 자체는 구현하기가 매우 쉽습니다. 그런 다음 compare 메소드를 사용하여 그러한 객체의 배열을 정렬 할 수 있습니다.

1

문자열의 형식이 올바른 경우 0으로 시작하고 NSArray을 입력 한 다음 sortedArrayUsingComparator:을 호출하십시오. 그러나 12 : 34.567 및 2 : 34.567과 같은 값을 사용하면이 접근 방식이 작동하지 않습니다. double 또는 NSNumber 중 하나로 변환해야합니다 (즉, 2 : 34.567에서 154.567로 변환).

NSDate 개체가 아닙니다. NSDate는 특정 시점을 표시하며, 이는 단순히 지속 시간으로 보입니다.

NSNumber을 사용하는 경우에도 sortedArrayUsingComparator:을 계속 사용할 수 있습니다. mm : ss.SSS와 NSNumber 사이에서 변환하고 다시 돌아 오기 위해 NSFormatter의 서브 클래스를 작성해야합니다.

NSComparator에 대한 설명서는 blocks-based example을 참조하십시오. 또한 NSFormatter에 대한 클래스 참조가 필요합니다. FormatterKit project on GitHub에는 멋진 NSFormatter 샘플 코드가 있습니다.

+0

너 너무 가까워. 'sortedArrayUsingComparator :'는 디폴트 비교를 원한다면 과도하다. 'sortedArrayUsingSelector :'를'compare :'와 함께 사용하면됩니다.정답은'sortedArrayUsingComparator :'입니다. 비교기는 문자열 중 하나에'compare : options :'를 보내서 12 *를 처리하는 다른 * 숫자 형 * (NSNumericSearch' 옵션)과 비교하도록 요청합니다. -2 케이스 올바르게. –