【unity造轮子】排序排行榜的制作

List类中有一个【Sort方法】
可以非常快速的对【整数类】
或者【小数类】元素进行升序

public class TestCompare MonoBehaviour
{
	public List<int>numbers;
	private void Start()
	{
		numbers=new List<int>(){20,10,30,70,60,40,50,90,80,100}:
	}
	private void Update()
	{
		if(Input.GetKeyDown(KeyCode.Space))
			Sort();
		}
	}
	private void Sort()
	{
		numbers.Sort();
	}
}

复杂的数据排序测试

但是,只有基本的数据类型(指整数类和小数类)
可以直接使用【Iist.Sort方法】进行升序排列

而我们之后需要比较的,并不是单纯的【整数类型
而是每一个【角色资源文件中的得分】,即集合中需要排序的元素从【整数类】变成了【对像的某一属性
这里介绍一个概念【方法/函数重载Method Overloading】
(面试常问的小题)
指的就是方法/函数名称相同,但是括号内的参数不同,这里的$ot方法就有其他三种其他参数形式

其实就是一个包含了两个参数的【委托】
(委托是一个类型,这个类型可以赋值一个方法的引用,可以当作参数来传递
这里就是需要将一个函数名为Comparelnt,作为委托当作参数,使用在24行的sort0中)
因此使用这个方法,我们只需要定义一个【委托】两个参数都是PlayerData类型的

private void Sort()
{
	numbers.Sort(CompareInt);
}
private int CompareInt(int_a,int_b)
{
	//RETURN Greater one between A and B
	return _a.CompareTo(_b);
}

使用A.CompareTo(B)方法其实就是将AB进行比较
该方法会返回三个值:-1,1和0
如果返回值是1则说明A大于B
如果返回值是-1就表明A小于B

事实上,当你有了经验后,特别是在排序的问题上
会看到很多人用【Lambda表达式】简化代码量,更方便阅读

private void SortByCompare()
{
	//numbers.Sort(CompareInt);
	numbers.Sort((a,b)=>a.CompareTo(b));//MARKER LAMBDA Express/statement
	//If
	Debug.Log("CompareInt LAMBDA");
}

复杂的数据排序实战

我们既然可以使用方法器,对整数类排序(图1)
只要将Comparelnt(O方法中的参数类型进行调换,就可以完成对象属性的比较(图2)
(比如比较角色的得分,或者击杀数,进行排序)

numbers.Sort ((obj1,obj2)=>obj1.var.CompareTo(obj2.var))

冒泡排序

冒泡排序是许多领域包括Unty中经常使用的一种基本算法
(如背包系统中按照编号重新排序,互换物品位置等都用到了冒泡排序)

冒泡算法【核心思路】是比较相邻两个元素的大小,如果前者大于后者,那么【互换】
位置
反复循环进行比较,直到所有元素都不需要【互换】位置为止

public List<PlayerData>playerDatas = new List<PlayerData>();

private void SortByBulle()
{
	bool isBubble m true;
	do
	{
		isBubble▣false;
		for (int 1=0;playerDatas.Count -1;1++)
		{
			if (playerDatas[i].playerHighestscore > playerDatas[i+1].playerHighestscore)
				PlayerData temp = playerDatas[i]:
				playerDatas[i] = playerDatas[i+1];
				playerDatas[i+1] = temp:
				isBubble true;
			}
		}
	}
	while (isBubblc);
}

【unity造轮子】排序排行榜的制作_第1张图片
使用LINQ排序

同样的LNQ也可以很方便的解决升序排列的问题
(Language integrated Query:语言集成查询)
使用LINQ前必须引用System.Linq:命名空间
LINQ常用来对元素进行【排序】【搜索】】以及按照条件【筛选】等
(我的卡牌收藏系统系列打算使用LINQ功能搜索卡牌,之前的方法性能上不是很好)
通过【OrderBy】方法
可以直接对集合中的元素进行【升序排列】

//STEP 04 SORT BY LINO
if (Input.GetKeyDown(KeyCode.Space))
(
	SortByLINQ(playerDatas.Count):
}

//STEP 04
private ListsPlayerData>Soret8yLINQ(int count)
{
	return playerDatas.OrderBy(t=>t.playerHighestScore).Take(count).ToList();
}

你可能感兴趣的:(#,【Unity造轮子】,unity)