데이터를 커스텀 정렬하기

Tom·2024년 10월 16일
1
post-thumbnail

데이터가 많아지면 꼴도 보기 싫다. 특히 내가 원하는 데이터를 찾아야 할 땐 더더욱. 그럴 땐 내가 원하는 방법으로 정렬하여 조금이나마 보기 좋게 만들어서 필요한 걸 찾아보자. 근데 정렬을 하기 위해서 일단 먼저 랜덤하게 배치해야된다는게 아이러니
일단 랜덤으로 돌아가는 카드뭉치를 만들었다. 카드의 구조는 대충 이런식으로 만들었음.

using UnityEngine;

public enum CardValue
{
   Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King 
}

public enum CardSuit
{
    Heart, Diamond, Spade, Clover
}

public class Card 
{
    public CardValue value;
    public CardSuit suit;
    private Image image;
    
    public Card(CardValue _value, CardSuit _suit)
    {
        value = _value;
        suit = _suit;
    }
}

그리고 카드들을 담아둘 리스트를 만들고, 카드를 쓰까주는 메서드만 만들었다.

using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	List<Card> cards = new List<Card>();
    
	private void Awake()
    {
    	foreach (CardSuit suit in Enum.GetValues(typeof(CardSuit)))
        {
            foreach (CardValue value in Enum.GetValues(typeof(CardValue)))
            {
            	Card card = new Card(value, suit);
                cards.Add(card);
            }
    }
    
    private void ShuffleCards(ref List<Card> cards)
    {
        System.Random rand = new System.Random();
        int n = cards.Count;
        while (n > 1)
        {
            int k = rand.Next(n--); 
            Card temp = cards[n];
            cards[n] = cards[k];
            cards[k] = temp; 
        }
    }
}

그럼 리스트에 카드가 엉망진창으로 담기게 된다. 그리고 그냥 C#에서 제공하는 Linq로 소팅해주면 됨.

    private void SortCard(ref List<Card> cards)
    {
        cards = cards.OrderBy(x => x.suit).ToList();
        Refresh(cards); // 이건 그냥 UI 화면 업데이트 하는 메서드
    }

    private void SortCard2(ref List<Card> cards)
    {
        cards = cards.OrderByDescending(x => x.suit).ToList();
        Refresh(cards);
    }

    private void SortCard3(ref List<Card> cards)
    {
        cards = cards.OrderBy(x => x.value).ToList();
        Refresh(cards);
    }

    private void SortCard4(ref List<Card> cards)
    {
        cards = cards.OrderByDescending(x => x.value).ToList();
        Refresh(cards);
    }

근데 이런 간단한 정렬은 리스트의 Sort를 통해 처리할 수도 있다.

    private void SortCard(List<Card> cards, Comparison<Card> compare)
    {
        cards.Sort(compare);
        Refresh(cards);
    }

이렇게 외부에서 정렬방법을 전달해줘서 정렬하면됨. 매개변수로 소팅형식을 전달하면 된다. 예를 들어

	if(Input.GetKeyDown(KeyCode.Space))
    {
        SortCard((x, y) => x.suit.CompareTo(y.suit));
    }

이러면 무늬를 비교해서 오름차순으로 정렬하게 된다. Linq를 안써서 오버헤드도 안생김!
오늘의 결론 : 데이터 구조체 내부에 소팅을 위한 적절한 데이터를 삽입해둔다면 필요에 따라 손쉽게 원하는 순서대로 정렬이 가능하다.

profile
여기 글은 보통 틀린 경우가 많음
post-custom-banner

0개의 댓글