Objective C에서 인덱스에 관계없이 배열의 첫 번째 요소를 제거하고 (하나씩 줄이거 나) 작은 한 줄짜리 코드가 있습니까?Objective C에서 배열의 첫 번째 요소를 제거하려면 어떻게합니까?
답변
제거 된 항목을 반환하는 방법을 모르지만 NSArray#objectAtIndex:0
및 NSMutableArray#removeObjectAtIndex:0
을 조합하여이 작업을 수행 할 수 있습니다. shift
메서드를 구현하는 NSMutableArray
에 새로운 메서드 범주를 도입 할 수 있다고 가정합니다.
내가 인상적이었을 때 나는 ObjectAtIndex : 0을 PHP에서 찾을 수있는 것처럼 1의 인덱스로 시작한 배열로 남겨 두었습니다. 그러나 밝혀진 바와 같이, 그 중 하나를 부딪 히면 (내가 배열에 추가 한 가장 오래된 것임) 내가하는 일을 처리하기에 충분합니다. – ojreadmore
링크 된 문서에서는 shift와 비슷하게 다른 요소를 아래로 밀어 내리는 동작을 수행합니다. –
하나의 메소드 호출이 정말로 필요한 경우 필요한 것을 추가하는 샘플 카테고리 선언에 대한 내 대답을 참조하십시오. –
코코아 배열 객체 (NSArray/NSMutableArray)는 한 줄에 해당하는 것을 제공하지 않으므로 객체를 먼저 읽은 다음 제거해야합니다. 이 클래스가 -lastObject
및 -removeLastObject
이라는 메서드를 제공하지만 -firstObject
및 -removeFirstObject
이 아닌 메서드는 배열의 앞쪽에서 제거하는 것이 비효율적 인 작업임을 상기시켜야합니다. 그 이유는 내용을 한 위치 앞으로 이동해야하기 때문입니다. 이것은 본질적으로 포인터로 묶인 C의 배열에 특히 해당됩니다.
원시 데이터 형식 및/또는 매우 작은 배열을 사용하는 경우 첫 번째 요소를 "제거"하는 동작은 queue data structure을 나타내는 것으로 간주 할 수 있습니다. 객체 대기열을 만드는 방법에 대한 자세한 내용은 this SO question을 참조하십시오. 개인적으로 my opinion for that question은 실제 대기열 클래스가 가장 명확한 프로그래밍 관례를 제공한다는 것입니다.
@interface NSMutableArray (QueueOneLiner)
- (id) removeAndReturnFirstObject; // Verbose, but clearer than "shift"
@end
@implementation NSMutableArray (QueueOneLiner)
- (id) removeAndReturnFirstObject {
id object = [[self objectAtIndex:0] retain];
[self removeObjectAtIndex:0];
return [object autorelease];
}
@end
그러나, 그 점 솔루션 것입니다 원인을 : 당신은 당신이 원하는 것을 할 수있는 한 줄도 제공하지 않습니다 것을 (아마 NSMutableArray의 또는 다른 클래스의 카테고리로) 자신의 방법을 정의 할 수 있습니다 코드를 사용하는 코드의 성능 대 단순성의 중요성에 따라 가치가있는 것보다 많은 오버 헤드가 발생합니다.
QueueOneLiner가 잘못된 개체를 반환 할 수 있습니다. removeObjectAtIndex : 0은 가비지 콜렉션이 사용되지 않으면 조기에 할당을 해제 할 수있는 "object"를 해제합니다. 객체를 배열에서 제거하기 전에 객체를 유지하고 자동 갱신해야합니다. – dreamlax
뛰어난 점! 제안 내용을 포함하도록 수정되었습니다. –
그렇게하는 것이 좋지 않습니다. 당신은 내 다른 게시물의 일부를 보면 아이폰에
오브젝티브 C는 실제로 C의 성능 특권의 대부분을 사용할 수 있습니다
, 당신은 내가 조기 최적화에 대해 단호 해요 볼 수 있지만, 때를 것 C 레벨에서 코딩하고 있습니다. 불필요하게하지 않는 것이 있습니다.
- 이동 메모리
- 중복 구조
- 드문 드문 메모리 블록을 채워 할당
- 내부는
- ... (이 더 많이가 있지만 내 C-인생이 녹슨 내가 말한대로 루프 , 나는 반 - 최적화입니다.)
잘 구현 된 대기열이 필요합니다. 뭔가 큰 원형 메모리 구조를 미리 할당 한 다음 첫 번째 및 마지막 바이트를 추적하는 두 개의 포인터가 있습니다.
Objective-C에 대기열 데이터 구조가 없다는 사실에 놀랐습니다.
또한 단 하나의 라이너를 위해 노력하지 마십시오. 간결한 코드에 대한 모든 것들이 과대 평가되었습니다. 메서드를 호출하는 것이 더 합리적이라면 그렇게하십시오.당신이 obj
클래스/유형 이름과 arr
가 배열 배열 obj *arr
이있는 경우
perl "arrays"는 C 배열보다 잘 구현 된 큐와 비슷합니다. 그들은 "첫 번째"요소와 마지막 요소에 대한 오프셋을 저장하고 필요한 경우 지능적으로 미리 할당합니다. – ysth
Objective-C에서 Queue를 사용하는 더 많은 이유. 대부분의 인터프리터 언어는 컴파일 된 언어보다 약 100 배 느리다 - 그 속도로는 관심사가 완전히 다르며 모든 배열이 대기열의 오버 헤드를 갖게된다는 것이 합리적이다.하지만 C 언어에서는 그런 것을 찾을 수 없다. 기반 언어. –
, 당신은 단지 arr+1
가 첫 번째 요소없이 배열을 얻을 수 말할 수 있습니다. 이 당신에게 도움이 될 수
[arrayName removeObjectAtIndex:0];
사용이 코드,
이것은 받아 들여진 대답이 아직 제공하지 않았고'NSMutableArray' (NSArray가 아님)의 경우에만 사용할 수있는 유용한 정보를 더 제공하지 않습니다 – Stonz2
그것의 원래 포스터를 지원하지만 일반있는 NSArray 아닌있는 NSMutableArray이있는 경우,이 잘 작동 할 확실히 너무 늦게 :
id myData = myArray.firstObject;
myArray = [myArray subarrayWithRange:NSMakeRange(1, myArray.count - 1)];
배열에 항목이 하나만있는 경우가 아니라면 'loc' 값이 1이면 NSArray의 값을 벗어나고 NSRangeException을 던집니다. – SDJMcHattie
- 1. array_shift 배열의 첫 번째 요소를 제거하지
- 2. 파이썬에서 배열의 첫 번째 요소를 가져오고 싶습니까?
- 3. Visual Basic의 배열에서 다섯 번째 요소를 모두 제거하려면 어떻게합니까?
- 4. 배열의 첫 번째 요소 $$ foo
- 5. objective-c에서 새 이미지가있는 uibutton의 오래된 이미지를 제거하려면 어떻게합니까
- 6. jQuery를 사용하여 링크의 텍스트에서 첫 번째 문자를 제거하려면 어떻게합니까?
- 7. 배열의 m 번째 요소를 삭제하십시오.
- 8. Dwoo에서 배열의 첫 번째 요소 가져 오기
- 9. PHP - 배열의 첫 번째 요소에 쓰기
- 10. Objective-C에서 상주하는 더티 메모리를 제거하려면 어떻게해야합니까?
- 11. forEach를 사용하여 목록에서 요소를 제거하려면 어떻게합니까?
- 12. 드롭 다운 선택에 따라 HTML 양식의 요소를 제거하려면 어떻게합니까? (JS?)
- 13. json_encode는 배열의 첫 번째 요소 만 반환합니까?
- 14. 문자열에서 문자열 배열의 첫 번째 위치 찾기
- 15. 배열의 첫 번째 최소 윈도우 찾기
- 16. 다차원 배열의 첫 번째 레이어에 array_key_exist
- 17. PHP : 배열의 배열의 첫 번째 "열"에서 검색
- 18. QMap의 첫 번째 요소 5 개를 제거하십시오.
- 19. VB.NET 텍스트 상자의 첫 번째 줄 제거
- 20. C#의 SortedList에서 첫 번째 요소를 반환합니다.
- 21. Xpath가 첫 번째 이후의 요소를 찾지 못했습니다.
- 22. 목록의 첫 번째 요소를 제거하는 방법
- 23. 첫 번째 요소와 마지막 요소를 제외하는 방법
- 24. 프롤로그 목록에서 첫 번째 N 요소를 삭제하십시오.
- 25. 배열의 첫 번째 요소 만 빼고 모든 요소 가져 오기
- 26. 스킴에서 기호의 첫 번째 문자를 추출하려면 어떻게합니까?
- 27. C에서 첫 번째 경기를 건너 뛰는 두 번째 경기 대체 #
- 28. DOM에서 요소를 제거하려면 어떻게해야합니까?
- 29. Objective-C에서 문장의 첫 단어를 어떻게 대문자로 만드시겠습니까?
- 30. Objective-C 2.0에서 런타임에 인스턴스 메서드를 제거하려면 어떻게합니까?
맨손 C 스타일 배열 또는 NSArray/NSMutableArray와 같은 것을 말하고 있습니까? –
베어 스타일의 C 스타일 어레이의 경우 게이트에서 벗어나기 전에 문제가 발생합니다. C 스타일 어레이는 경계/유효한 크기 정보를 포함하지 않습니다. 나는 당신이 유효한 크기의 포인터를 전달할 수 있다고 추측하지만 그것은 추악해진다. –
다시 C 스타일 배열의 경우, * p ++는 교대와 비슷한 것을 성취한다. –