Bootstrap

面向对象程序设计之sort排序

目录

java

升序 

降序 

c# 

升序 

倒序

小结 


敲过排序算法的都会的,Sort排序与compareTo的改写。

java

升序 

一般自带的sort方法就是升序的。

Arrays.sort(arr);//传入要排序的数组,默认升序
Collections.sort(list);//传入要排序的集合类,默认升序
降序 

数组的可以传多个参数表示倒序,要了解一下比较器的规则。

//Arrays.sort(arr, new Comparator());第一个参数是待排序数组,第二个参数是改写的比较器 
Arrays.sort(arr, new Comparator());//改写Comparator()
//o1小于o2返回正值,o1大于o2返回负值,颠倒一下,即可实现降序排序
public int compare(Integer o1, Integer o2) {
  return o2 - o1;
}

//数据类型如int、‌double等不支持Comparable接口,可以通过包装类如Integer‌
Arrays.sort(arr, Collections.reverseOrder());//Collections要用包装类
Arrays.sort(arr,(s1,s2)->s2.compareTo(s1));//lambda 表达式调用
Arrays.sort(arr,(o1,o2)->o2 - o1);//通过lambda 表达式的返回值实现降序排序,也是用包装类Integer

//Arrays.sort(arr, start, end, new Comparator());int类型可以用四个参数的,注意中间两个参数是左开右闭的
Arrays.sort(a,0,cnt,(o1,o2) -> new Double(o2.n).compareTo(new Double(o1.n)));

集合类跟数组差不多,可以用方法、内部类或lambda 表达式回调。

//Collections.sort(arr, new Comparator());集合类类似,比较器也可以直接写方法进参数
Collections.sort(list, new Comparator<Integer>() {
  public int compare(Integer o1, Integer o2) {
     return o2 - o1;
  }
});//使用Collections的sort方法,重写compare方法

c# 

升序 

自带的Sort也是默认升序的,但注意看准参数,不要混淆。

Array.Sort(arr);//传入要排序的数组,默认升序,注意是Array不是Arrays
l.Sort();//传入要排序的集合类,默认升序,l是List集合类的实例化对象
倒序

可以写一个方法,类似java的比较器,排前面后面多看看就孰能生巧了。

//编写倒序的Sort方法
int Sort(s1,s2)
{
//以后面传入的数s2为基准,s1在s2的前面还是后面,即排在左边还是右边
	if (s1>s2)
	{
	   return -1;//返回一个负数,表示s1在s2的左边(s1是较大数)
	   //return s2-s1;
	}
	else if (s1<s2)
	{
	   return 1;//返回一个正数,表示s1在s2的右边(s1是较小数)
	   //return s1-s2;
	}
	else
	{
		return 0;          
	}
};

当然,c#的数组集合类倒序实现还简单一点,实在理解不了把下面常见的记熟了,记住倒序倒一下即可。

//升序后直接倒
Array.Reverse(arr);
//lambda 表达式调用
Array.Sort(arr, (s1, s2) => s2.CompareTo(s1));
//lambda 表达式调用,小白式读法,如果s1大于s2,返回一个负数表示s1在s2的左边(s1是较大数),否则返回一个正数表示s1在s2的右边(s1是较小数)
Array.Sort(arr, (s1, s2) => s1 > s2 ? -1 : 1);
//取相反或倒过来
l.Sort((x, y) => -x.CompareTo(y));
//注意别被绕晕,s1、s2倒一下就刚好对应倒序
l.Sort(s1, s2) => s2.n > s1.n ? 1 : -1;

小结 

在处理简单的升序排序中,java跟c#的sort的理解助你勇闯排序算法,手撕排序。

;