【C#/Unity】0を一番後ろに回すソートのやり方【昇順・降順】

Uncategorized

普通にソートすると、0って一番前に来るんだよね
開発してると、たまに基礎を忘れてしまうので、忘備録

やりたいこと

まずはランダム値を生成
それを、通常ソートしてみると、上の青文字のような感じ
0が先頭に来てしまう
さらに、0を後ろにやるソートをしてみたのが赤文字のとこ

ソースコード

using UnityEngine;
using System.Collections.Generic;

public class Sample : MonoBehaviour
{
    List<int> listSample = new List<int>();

    void Start()
    {
        //ランダム値作成
        MakeRandom();
        //通常のソート実行
        RegularASCSort();
        //通常のソート実行
        RegularDESCSort();
        //0を後ろにやるソート実行
        ZeroASCSort();
        //0を後ろにやるソート実行
        ZeroDESCSort();
    }

    /// <summary>通常降順ソート</summary>
    void RegularASCSort() 
    {
        listSample.Sort();

        Debug.Log("<Color=blue>■通常昇順ソート</color>");
        ShowText();
    }

    /// <summary>通常降順ソート</summary>
    void RegularDESCSort()
    {
        listSample.Sort((a, b) => b - a);

        Debug.Log("<Color=blue>■通常降順ソート</color>");
        ShowText();
    }

    /// <summary>0を後ろにやる昇順ソート</summary>
    void ZeroASCSort()
    {
        listSample.Sort((a, b) =>
        {
            if (a == 0) return 1;
            else if (b == 0) return -1;
            else return a - b;
        });

        Debug.Log("<Color=red>■0を後ろにやる昇順ソート</color>");
        ShowText();
    }

    /// <summary>0を後ろにやる降順ソート</summary>
    void ZeroDESCSort()
    {
        listSample.Sort((a, b) =>
        {
            if (a == 0) return -1;
            else if (b == 0) return 1;
            else return b - a;
        });

        Debug.Log("<Color=red>■0を後ろにやる降順ソート</Color>");
        ShowText();
    }

    /// <summary>ランダム値作成</summary>
    void MakeRandom()
    {
        listSample.Add(0);
        for(int i = 0; i < 30; i++) 
        {
            var random = Random.Range(0, 100);
            listSample.Add(random);
        }

        Debug.Log("■ランダム値作成");
        ShowText();
    }

    /// <summary>テキスト表示</summary>
    void ShowText() 
    {
        var text = "";
        foreach(var list in listSample)
        {
            if (text == "")
            {
                text = list.ToString();
            }
            else 
            {
                text = string.Format("{0}, {1}", text, list.ToString());
            }
        }

        Debug.Log(text);
    }
}

解説

通常の昇順ソートはこんな条件でソートされてる

value.Sort((a, b) => a - b)
条件返り値
a > b (aが大きい)+
a = b0
a < b (bが大きい)ー

0を一番後ろにするってことは、
0はどの数字よりも大きいということだから、
上記の条件に従えば、

条件返り値
a = 0(a(=0)が大きい事になるので、a>bが当てはまり、+になる)+
b = 0(b(=0)が大きい事になるので、a<bが当てはまり、ーになる)ー
その他a – b

コードを見てみると、こんな感じ

listSample.Sort((a, b) => 
{ 
 if (a == 0) return 1; 
 else if (b == 0) return -1;
 else return a - b; 
}); 
タイトルとURLをコピーしました