2014-04-23 3 views
2

나는 인터뷰에서 다음 질문을 받았다. 배열 목록에있는 순서대로 키를 사용하여 사전을 정렬하려면 어떻게해야합니까? 어떻게이 배열 목록에있는 순서대로 사전을 정렬 할 수 있습니다Arraylist에서 순서대로 키로 사전 정렬

ArrayList stringArList = new ArrayList(); 

stringArList.Add("1"); 
stringArList.Add("2"); 
stringArList.Add("3"); 
stringArList.Add("5"); 
stringArList.Add("6"); 
stringArList.Add("7"); 
stringArList.Add("4"); 

을 다음과 같이

그래서 예를 들어 나는

Dictionary<string, string> stringDict = new Dictionary<string, string>(); 

stringDict.Add("1", "One"); 
stringDict.Add("7", "Seven"); 
stringDict.Add("6", "Six"); 
stringDict.Add("2", "Two"); 
stringDict.Add("3", "Three"); 
stringDict.Add("5", "Five"); 
stringDict.Add("4", "Four"); 

을 다음과 같이 사전을 가지고 배열 목록?

+5

흠. 내 대답은 "사전에는 순서가 없습니다"입니다. 그렇다면 그들이 나를 고용하지 않았다면, 나는 어쨌든 그들을 위해 일하고 싶지 않다는 것을 알았습니다. :) –

+0

... 주문한 사전이 아니면. –

+1

D Stanley에 동의합니다. 가장 가능성이있는 것은 속임수입니다. 이 인터뷰 질문은 제 의견으로는 시대에 뒤떨어져 있습니다. 구식의 "이 올바른 문제를 해결할 수 있습니까? 어떻게하면 좋을까요?"코딩 시간으로 대체해야합니다. 이 질문은 다소 고위 엔지니어가 자신의 자부심을 높이기 위해 만드는 질문입니다. (나는 그것들을 많이 만들었 기 때문에 그것을 안다 ... 그렇다면 나는 자존심을 높이기 위해 인터뷰를 사용할 필요가 없다는 것을 깨달았다 ... 나는 내가하는 일에 정말로 능숙하고 나의 행동이 증명된다. 그것은 내가 인터뷰하는 사람보다 더 영리하다는 것을 증명하지는 않습니다.) – Markus

답변

2

그럼 당신은 그 자체 사전을 정렬 할 수 없습니다,하지만 당신은 목록으로 키 - 값을 쌍을 추출하고 그 종류 수 있습니다

IEnumerable<KeyValuePair<string, string>> pairs = 
    stringDict.OrderBy(kvp => stringArList.IndexOf(kvp.Key)); 

그러나 방법은 "트래버스가이 아니다 "특정 순서의 사전 항목.

당신은 SortedDictionary를 만들 수와 같은 Comparer 구현과 IComparer<string>

var d = new SortedDictionary<string, string>(stringDict, 
             new PositionComparer(stringArList)); 

을 제공 : 필요에 따라 정렬 된 값의 목록을 생성합니다

public class PositionComparer : IComparer<string> 
{ 
    private ArrayList Keys {get; set;} 

    public PositionComparer(ArrayList keys) 
    { 
     Keys = keys; 
    } 

    public int Compare(string s1, string s2) 
    { 
     return Keys.IndexOf(s1).CompareTo(Keys.IndexOf(s2)); 
    } 
} 
2

이.

var sortedValues = stringDict.OrderBy(pair => stringArList.IndexOf(pair.Key)) 
          .Select(pair => pair.Value) 
          .ToList(); 
0

이 질문에서 이전에 여러 번 언급했듯이 C# Dictionary은 정렬 할 수 없습니다. 이것은 구현에 내재되어 있습니다. here을 읽을 수 있기 때문에 사전은 Hashtable을 사용하여 구현됩니다. 즉, 해당 항목에는 순서가 없습니다. "이 사전의 첫 번째 요소를 말해줘"라고 말할 수는 없습니다. 단순히 첫 번째, 두 번째 또는 마지막 요소가 없습니다. 사전에있는 요소에 대해 말할 수있는 유일한 것은 사전에 위치를 결정하는 고유 한 식별자가 있다는 것입니다 (해시 함수의 도움이 조금 필요함).

예를 들어 array에 요소가있는 경우 "이 요소는 다음 요소입니다."또는 "이 요소는 이전 요소입니다"라고 말할 수 있습니다. 배열의 각 요소는 이전과 다음을가집니다. 이것은 사전에 대해 보유하지 않습니다.

사전에 항목을 삽입하면 키를 기반으로 해시 (상당히 고유 한 번호)가 생성됩니다. 예를 들어, 이름으로 구성된 키의 매우 단순한 (및 나쁜) 해시는 이름에 ASCII 값으로 표시된 각 문자의 합계를 취한 다음이를 함께 더하는 것입니다. 결과는 숫자입니다 (예 : 5). 그런 다음 위치 5의 상점 (예 : 배열)에 값을 삽입합니다. 그러나 위치 5에서 다른 값이 발생하면 동일한 해시 결과가 발생합니다. collision . 이 문제를 해결하는 방법과이를 피하는 방법은 해시 테이블에 관한 것입니다. 자세한 내용은 위키를 참조하십시오.

someName 키를 사용하여 값을 요청하면 해당 값을 해시하고 해당 위치에서 조회합니다.

해시 테이블은 방금 설명한대로 쉽지 않습니다. 너무 많이 있습니다. Wiki에서 자세한 내용을 볼 수 있습니다.

"이 사전 정렬"에 대한 대답은 "아니오 할 수 있습니다."입니다. 그러나 목록과 같은 정렬 가능한 데이터 구조로 변환하거나 다른 방식으로 정렬 할 수 있습니다.

0

빠른 답장을 보내 주셔서 감사합니다. 대단히 감사합니다. 나는 다음 답으로 대답했다.

var list = from arElement in stringArList.ToArray().ToList() 
        join dict in stringDict on arElement equals dict.Key 
        select dict ; 

그러나 면접자의 시선은 인상적이었습니다.

+0

arraylist에서의 위치에 따라 항목을 실제로 주문하지 않았습니다. –

+0

글쎄, 무슨 뜻인지 모르겠지만, 배열 목록의 순서에 따라 정렬 할 수 있습니다. (오히려 새로운 사전을 만듭니다). 나는 그것을 달리고 잘 작동하는 것을 보인다. 왜 이것이 효과가 없을 것이라고 생각하는지 자세히 설명해 주시겠습니까? – user3375390

+0

오, 그래, 네가 여기서 무슨 뜻인지 이해할 것 같아. 당신 말이 맞아요, 제가 원래의 사전을 정렬 할 수있는 방법은 없습니다. 사실 나는 그에게 문제에 접근하는 방법에 관해서 나에게 인터뷰하는 사람에게 물었습니다. 그는 바보 같은 엉덩이였습니다. 그는 나에게 명확하지 않은 어떤 것을 숨 겼고 이해가되지 않았습니다. 그가 옳은 대답을 알지도 못했음이 분명했습니다. – user3375390