2009-06-01 3 views
1

FIFO를 허용 할 수있는 컬렉션 개체/전략을 찾고 있으며 단순히 위치를 지정하여 컬렉션의 항목을 볼 수 있습니다. 명확히하기 위해 :FIFO를위한 최상의 컬렉션 개체 및 위치별로 항목을 볼 수있는 능력

  1. 나는 100 DTO 객체 말을 유지하기 위해 데이터 구조를 좋아하는 것, 그것이 (101)에 도달 할 때 다음, 나는 첫 번째 항목 등 (FIFO)을 삭제하여 공간을 만들 수 있습니다.

  2. 요청시 이러한 객체의 최신 x #을 반환하고 싶습니다.

닷넷 큐 객체를 사용해 보았지만, # 2를 지원하지 않는다고 말할 수는 있지만 뭔가를 간과 할 수도 있습니다.

답변

2

대기열에서 항목을 팝업하려면 List를 래핑하고 RemoveAt (0)을 수행하는 것이 어렵지 않습니다. 그렇게하면 FIFO가 생기고 어디서나 색인을 생성 할 수 있습니다. 대기열의 무결성을 보호하기 위해이 파일을 포장해야합니다 (FIFO 만 해당).

+1

인덱싱이 O (N) 작업이므로 List를 래핑하지 않습니다. OP가 대기열에 자주 색인하기를 원하는 것처럼 들리므로 큰 걱정거리입니다. 배열은 O (1) 임의 액세스 시간을 제공합니다. – arke

+0

List 클래스와 마찬가지로 .NET에서 List 은 배열을 내부적으로 사용하지만 항목 # 0을 제거하는 것은 O (N) 연산이므로 오버 헤드가 동일하므로 그냥 같은 위치에 있지 않습니다. –

+0

아, 맞아, 나는 LinkedList를 생각하고 있었다. 이 경우 래퍼 컬렉션 클래스에서 읽기 및 쓰기 색인을 사용하면 OP가 염려하는 모든 작업에 대해 O (1)이됩니다. – arke

1

.NET 문서를 빠르게 살펴 봤는데 필요한만큼 찾지 못했습니다. 너무 어렵지는 않지만 직접 구현해야하는 것처럼 보입니다. 적절한 크기의 배열을 사용하고 배열의 현재 위치에 대한 색인을 읽고 쓰고 순환 배열로 사용하는 것이 좋습니다.

Enqueue는 readIndex에 값을 쓰고 readIndex를 ((readIndex + 1) % queueSize)로 설정합니다. Dequeue는, readIndex == writeIndex의 경우는 예외를 슬로우합니다. 그렇지 않은 경우는, writeIndex로 값을 취득한 다음, (writeIndex + 1) % queueSize만큼 writeIndex를 증가시킵니다. 큐의 인덱스 (큐의 맨 위에서 마지막으로 큐에 있던 항목)를 엿보는 것은 ((queueSize + (readIndex-index)) % queueSize)에 항목을 반환합니다.

관련 문제