list的sort怎么按条件排序(java中list排序sort降序)

http://www.itjxue.com  2023-01-24 15:42  来源:未知  点击次数: 

如何对List 进行排序

第一种:实体类实现IComparable接口,而且必须实现CompareTo方法

class Info:IComparable

{

public int Id { get; set; }

public string Name { get; set; }

public int CompareTo(object obj) {

int result;

try

{

Info info = obj as Info;

if (this.Id info.Id)

{

result = 0;

}

else

result = 1;

return result;

}

catch (Exception ex) { throw new Exception(ex.Message); }

}

}

调用方式如下,只需要用sort方法就能实现对list进行排序。

private static void ReadAccordingCompare() {

ListInfo infoList = new ListInfo();

infoList.Add(

new Info() { Id = 1, Name = "abc" });

infoList.Add(new Info() { Id = 3, Name = "rose" });

infoList.Add(new Info() { Id = 2, Name = "woft" });

infoList.Sort();

foreach (var item in infoList)

{

Console.WriteLine(item.Id + ":" + item.Name);

}

}

第二种方法:linq to list进行排序

运用linq实现对list排序,在实体类定义的时候就不需用实现IComparable接口,调用方式如下:

private static void ReadT(string str) {

ListInfo infoList = new ListInfo();

infoList.Add(

new Info() { Id = 1, Name = "woft" });

infoList.Add(new Info() { Id=3,Name="rose"});

infoList.Add(new Info() { Id = 2, Name = "abc" });

Console.WriteLine("ReadT*********************");

IEnumerableInfo query = null;

query = from items in infoList orderby items.Id select items;

foreach (var item in query)

{

Console.WriteLine(item.Id+":"+item.Name);

}

}

但是上面两种方式都只能对一个实体属性排序,如果对不同的属性排序的话只能写很多的if进行判断,这样显得很麻烦。且看下面的方式实现根据传入参数进行排序。

private static void ListSort(string field,string rule)

{

if (!string.IsNullOrEmpty(rule)(!rule.ToLower().Equals("desc")||!rule.ToLower().Equals("asc")))

{

try

{

ListInfo infoList = GetList();

infoList.Sort(

delegate(Info info1, Info info2)

{

Type t1 = info1.GetType();

Type t2 = info2.GetType();

PropertyInfo pro1 = t1.GetProperty(field);

PropertyInfo pro2 = t2.GetProperty(field);

return rule.ToLower().Equals("asc") ?

pro1.GetValue(info1, null).ToString().CompareTo(pro2.GetValue(info2, null).ToString()) :

pro2.GetValue(info2, null).ToString().CompareTo(pro1.GetValue(info1, null).ToString());

});

Console.WriteLine("*****ListSort**********");

foreach (var item in infoList)

{

Console.WriteLine(item.Id + "," + item.Name);

}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

} Console.WriteLine("ruls is wrong");

}

调用方式:

ListSort("Name","desc");//表示对Name进行desc排序

ListSort("Id","asc");//表示对Id进行asc排序。如此如果参数很多的话减少了很多判断。

java 怎么将List里面数据排序

学生实体类,包含姓名和年龄属性,

比较时先按姓名升序排序,如果姓名相同则按年龄升序排序。

第一种:实体类自己实现比较

(实现comparable接口:public interface ComparableT ,里面就一个方法声明:public int compareTo(T o); )

然后利用List类的sort(Comparator? super E c)方法或java.util.Collections工具类的sort(ListT list) (其实里面就一句:list.sort(null); )进行排序:

结果:

第二种:借助比较器进行排序。

示例代码:

比较器java.util.Comparator类是一个接口(public interface ComparatorT ),包含int compare(T o1, T o2);等方法:

我们的比较器要实现该接口并实现compare方法:

比较的时候可以利用List的sort(Comparator? super E c)方法(或者java.util.Collections工具类的sort(ListT list, Comparator? super T c)方法)进行排序。

结果跟第一种方法一样:

sort、sorted排序技巧(多级排序)

Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。

示例:

1)排序基础

简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list,新的list的元素基于小于运算符( lt )来排序。

你也可以使用list.sort()方法来排序,此时list本身将被修改。通常此方法不如sorted()方便,但是如果你不需要保留原来的list,此方法将更有效。

另一个不同就是list.sort()方法仅被定义在list中,相反地sorted()方法对所有的可迭代序列都有效。

2)key参数/函数

从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用。 例如通过key指定的函数来忽略字符串的大小写:

key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。

更广泛的使用情况是用复杂对象的某些值来对复杂对象的序列排序,例如:

同样的技术对拥有命名属性的复杂对象也适用,例如:

3)Operator 模块函数(多级排序)

上面的key参数的使用非常广泛,因此python提供了一些方便的函数来使得访问方法更加容易和快速。operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法。使用这些方法,上面的操作将变得更加简洁和快速:

operator模块还允许多级的排序,例如,先以grade,然后再以age来排序:

4)升序和降序

list.sort()和sorted()都接受一个参数reverse(True or False)来表示降序或升序排序。

例如对上面的student降序排序如下:

5)排序的稳定性和复杂排序

从python2.2开始,排序被保证为稳定的。意思是说多个元素如果有相同的key,则排序前后他们的先后顺序不变。

注意在排序后'blue'的顺序被保持了,即'blue', 1在'blue', 2的前面。

更复杂地你可以构建多个步骤来进行更复杂的排序,例如对student数据先以grade降序排列,然后再以age升序排列。

c# list sort多条件排序

class?Data?{?public?int?aa;?public?int?bb;?public?int?cc;?}

static?void?Main()

{

????ListData?list?=?new?ListData();

????list.Sort((a,?b)?=

????????a.aa?!=?b.aa???a.aa.CompareTo(b.aa)?:

????????a.bb?!=?b.bb???a.bb.CompareTo(b.bb)?:

????????a.cc.CompareTo(b.cc)

????);

}

python中list.sort()的用

只要是可迭代对象都可以用sorted 。

sorted(itrearble, cmp=None, key=None, reverse=False)

=号后面是默认值 默认是升序排序的, 如果想让结果降序排列,用reverse=True

最后会将排序的结果放到一个新的列表中, 而不是对iterable本身进行修改。

eg:

1, 简单排序

sorted('123456') 字符串

['1', '2', '3', '4', '5', '6']

sorted([1,4,5,2,3,6]) 列表

[1, 2, 3, 4, 5, 6]

sorted({1:'q',3:'c',2:'g'}) 字典, 默认对字典的键进行排序

[1, 2, 3]

sorted({1:'q',3:'c',2:'g'}.keys()) 对字典的键

[1, 2, 3]

sorted({1:'q',3:'c',2:'g'}.values()) 对字典的值

['c', 'g', 'q']

sorted({1:'q',3:'c',2:'g'}.items()) 对键值对组成的元组的列表

[(1, 'q'), (2, 'g'), (3, 'c')]

2, 对元素指定的某一部分进行排序,关键字排序

s = ['Chr1-10.txt','Chr1-1.txt','Chr1-2.txt','Chr1-14.txt','Chr1-3.txt','Chr1-20.txt','Chr1-5.txt']

我想要按照-后的数字的大小升序排序。要用到key

sorted(s, key=lambda d : int(d.split('-')[-1].split('.')[0]))

['Chr1-1.txt', 'Chr1-2.txt', 'Chr1-3.txt', 'Chr1-5.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-20.txt']

这就是key的功能,制定排序的关键字,通常都是一个lambda函数,当然你也可以事先定义好这个函数。如果不讲这个关键字转化为整型,结果是这样的:

sorted(s, key=lambda d : d.split('-')[-1].split('.')[0])

['Chr1-1.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-2.txt', 'Chr1-20.txt', 'Chr1-3.txt', 'Chr1-5.txt']

这相当于把这个关键字当做字符串了,很显然,在python中,'2' '10'

你可以定制你想要的key, 如 key = lambda x : len(x) 按照序列的长度去排序。key= lambda x : (x[1], x[0]) 按二个元素,再第一个 等等。。。

(责任编辑:IT教学网)

更多

推荐Flash教程文章