버그 해결을 위한 모든 질문을 던져
+1 vote
321 views
질문이 제목이 조금 애매하긴 한데..

특정 배열을 원하는 조건으로 정렬했을때, 정렬된 순서의 index를 알고 싶습니다.

예를 들어 ClassA의 멤버 변수로 int value가 있고, ClassA[] arr = new ClassA[3]; 배열이 존재할때

위 arr를 value 오름차순으로 정렬을 했을 때,

정렬된 배열에서의 각 인덱스를 따로 배열에 저장해 두려고 합니다.

예를 들어서>

arr[0].value = 5;

arr[1].value = 3;

arr[2].value = 6;

 

정렬된 인덱스 배열은

int[3] indexSorted ;; 가 있다고 치고...

indexSorted[0] = 1;

indexSorted[1] = 0;

indexSorted[2] = 2;

를 원하는 것입니다.

 

단순하게 하는 방법이야 여럿 있겠지만..

뭔가 아름답게 구현하는 방법이 없을까요????
asked (17 point) , 321 views

3 answers

+2 votes
우수 답변
class Sample
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }
}

static void Main(string[] args)
{
    var samples = new List<Sample>(1000);
    var r = new Random(DateTime.Now.Millisecond);

    for (int i = 0; i < 1000; ++i)
    {
        samples.Add(new Sample()
        {
            X = r.NextDouble(),
            Y = r.NextDouble(),
            Z = r.NextDouble()
        });
    }

    var ret = samples.OrderBy(x => x.X)
                        .Select((s, index) => new { s, index }).ToList();
}

보통 이렇게 많이 하지 않나요....

answered (46 point)
선택됨
아.. linq로 간단하게 되는거였군요...

인덱스만 따로 저장해둔다고 하셨으니 인덱스를 먼저 매기고 정렬을 하면 될거 같습니다.

var ret = samples.Select((s, index) => new { s, index })
                 .OrderBy(x => x.s.X)
                 .Select(x => x.index).ToList();

 

+2 votes
문제를 다르게 해석하면, 배열의 각 값보다 작은 숫자의 갯수를 구하는 문제로 볼수도 있을것 같습니다.

정렬된 순서의 idx라는건 결국 랭킹과 같고, 랭킹은 나보다 작은 값이 몇개인지를 나타내니까요
answered (26 point)
괜찮은 접근인거 같습니다. 1따봉 드립니다.
0 votes

Array라고 하셨지만 List를 활용하면 이런 방법도 됩니다.

 


 

   public class TestCLS
    {
        public int Tier_ = 0;
    }

    private class TierSorter : IComparer<TestCLS>
    {
        public int Compare(TestCLS x, TestCLS y)
        {
            if (x.Tier_ < y.Tier_)
            {
                return -1;
            }
            else if (x.Tier_ > y.Tier_)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
    };

    private class ISorter : IComparer<int>
    {
        public int Compare(int x, int y)
        {
            if (x < y)
            {
                return -1;
            }
            else if (x > y)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
    };


    public void test_func()
    {
        List<TestCLS> t = new List<TestCLS>();
        t.add(...);
        t.add(...);
        t.add(...);

        t.Sort(new TierSorter());


        List<int> ti = new List<int>();
        ti.add(0);
        ti.add(2);
        ti.add(1);

        ti.Sort(new ISorter());
    }


 

answered (35 point)
질문을 잘 못 이해하신거 같네요...

정렬하는 방법을 몰라서 물어본것이 아니라....

 

실제 대상 배열(혹은 리스트)을 실제 정렬하지 않고, 정렬했을 때의 순서 번호만 알고 싶다는 것이 요지입니다.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

127 질문
222 answers
253 댓글
246 users