2014-11-11 4 views
3

LRU를 만들고 값 순서를 유지하려고합니다.C 배열에 null을 넣는 순서를 변경하십시오.

그래서 P4가 (항목 = "P1", "P3", "P4", null)

  • P4가 존재하지 않습니다 나타납니다, 그래서 그냥 가장 낮은 null 색인에 추가 내가 배열을 items = "P1", "P3", null, null

    • 이 있다고 할 수 있습니다. P1의 자리는 내가 다음과 같이 모든 이동하는 방법 (내 질문)가 필요합니다
    • null (항목 = null, "P3", "P4", null) (항목 = "P3", "P4", null, null)로 이동 있도록
    • 그러나 다음 P1이 다시 오실
    • 그리고 P1을 추가 가장 낮은 null 인덱스 (항목 = "P3", "P4", "P1", null) 등
    • 그리고,

    LRU

  • 의 유지 트랙 그래서 나는 O를 (배열의 전면에 모든 비 - 널 (null)를 이동하는 방법을 찾아야 rder).

    items = items.Where(s => !String.IsNullOrEmpty(s)).ToArray();을 사용하는 게시물을 찾았지만 배열 크기를 그대로 유지하려면 null을 모두 제거합니다. ,

    +2

    당신은 다시 구축 할 지금, 처음부터 전체 배열을하고, 매 항목마다 아무것도 변경을 다시 채우기 싶지 않아요. 그것은 단지 규모가 조정되지 않습니다. – Servy

    +0

    https://gist.github.com/nakhli/6686251 –

    +1

    LRU는 [최소 최근 사용 횟수]를 의미합니다 (http://en.wikipedia.org/wiki/Cache_algorithms#LRU). // 배열을 사용하는 이유는 무엇입니까? 'List '을 대신 사용했다면'.Remove ("P1")','.Add ("P1")'할 수 있습니다. '.Remove' 메쏘드는 항목이 아무 곳에도 없을 때'List <>'를 변경하지 않고 OK라는 것을 기억하십시오. 구현이 더 쉬울 것입니다. 여전히 비효율적입니다. 성능에 문제가 있다면 (@Servy가 말한 것과 같이), 어떤 종류의 [linked list] (http://en.wikipedia.org/wiki/Linked_list)를 사용하십시오. –

    답변

    4

    그냥 그대로 "먼저 null 이외의 항목을 끝으로 모든 널 (null)을 이동하면서

    어떻게 내 배열 크기를 보존 할 수 있으며, 앞으로 모든 비 - 널 (null)은 (여전히 순서대로 값을 유지) 다음 널 항목 "

    var nulls = items.Where(x => x == null); 
    var nonnulls = items.Where(x => x != null); 
    var result = nonnulls.Concat(nulls); 
    

    또는 :

    var result = items.OrderBy(x => x == null).ThenBy(x => x.SomeOtherKey); 
    
    +1

    OP가 배열 유형을 찾고있을 수 있습니다. 그들은 이것을 달성하기 위해'.ToArray()'를 사용할 수있다. – MushinNoShin

    +0

    감사합니다. @MushinNoShin! – Austin

    0

    여기에 새로운 배열을 생성하지 않는 솔루션입니다. 기존 배열을 재정렬합니다. 이 같은

    static void MoveFront<T>(T[] arr) where T : class 
    { 
        int ileft = 0; 
        int iright = 1; 
    
        while (iright < arr.Length) 
        { 
         T left = arr[ileft]; 
         T right = arr[iright]; 
    
         if (left == null && right != null) 
         { 
          Swap(arr, ileft++, iright++); 
         } 
         else if (left == null && right == null) 
         { 
          iright++; 
         } 
         else if (left != null && right != null) 
         { 
          ileft += 2; 
          iright += 2; 
         } 
         else if (left != null && right == null) 
         { 
          ileft++; 
          iright++; 
         } 
        } 
    } 
    
    static void Swap<T>(T[] arr, int left, int right) 
    { 
        T temp = arr[left]; 
        arr[left] = arr[right]; 
        arr[right] = temp; 
    } 
    

    전화는 :

    string[] arr = { "a", null, "b", null, "c" }; 
    MoveFront(arr); 
    
    관련 문제