list元素排序(list根据字段排序)

http://www.itjxue.com  2023-02-12 19:59  来源:未知  点击次数: 

python中的list元组如何按照第二维元素排序

在Python中可以使用sorted函数对list进行排序,但是如果排序的对象是一个包含tuple的list时,sorted函数会使用tuple的第一个元素。

如果想要使用tuple的第二个元素进行排序,可以向sorted函数传入一个key参数,key参数必须是一个函数,输入是list的一个元素,输出最好是一个数字或简单的字符。

构造这样一个函数可以使用匿名函数lambda,示例代码如下:

myList?=?[('dungeon',7),('winterfell',4),('bran',9),('meelo',6)]

print?sorted(myList,?key=lambda?x:x[1])

#?[('winterfell',?4),?('meelo',?6),?('dungeon',?7),?('bran',?9)]

如何对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排序。如此如果参数很多的话减少了很多判断。

list排序的几种方式

List容器貌似是不支持直接写数字的,你是不是通过String的方式放进去的呢?

public static void main(String[] args) {

test();

}

public static void test() {

ListString list = new ArrayListString();

list.add("6");

list.add("5");

list.add("");

list.add("3");

list.add("1");

list.add("2");

list.add("4");

Collections.sort(list);

System.out.println(list);

}

另外,如果是数字,也是一样的处理方式,关于数组排序了解下Collections的API就好,见参考资料

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)方法)进行排序。

结果跟第一种方法一样:

如何对 List 排序

Collections对List集合中的数据进行排序

有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到

Java中提供的对集合进行操作的工具类Collections,其中的sort方法

先看一个简单的例子:

public static void main(String[] args) {

ListInteger nums = new ArrayListInteger();

nums.add(3);

nums.add(5);

nums.add(1);

nums.add(0);

System.out.println(nums);

Collections.sort(nums);

System.out.println(nums);

}

输出结果:

[3, 5, 1, 0]

[0, 1, 3, 5]

稍微复杂的List里面放一个复杂的对象

package core.java.collection.collections;

public class User implements ComparableUser{

private int score;

private int age;

public User(int score, int age){

super();

this.score = score;

this.age = age;

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int compareTo(User o) {

int i = this.getAge() - o.getAge();//先按照年龄排序

if(i == 0){

return this.score - o.getScore();//如果年龄相等了再用分数进行排序

}

return i;

}

}

public static void main(String[] args) {

ListUser users = new ArrayListUser();

users.add(new User(78, 26));

users.add(new User(67, 23));

users.add(new User(34, 56));

users.add(new User(55, 23));

Collections.sort(users);

for(User user : users){

System.out.println(user.getScore() + "," + user.getAge());

}

}

输出结果:

55,23

67,23

78,26

34,56

我们会发现sort(ListT)方法中List中的T必须实现ComparableT接口,然后实现

compareTo()方法,该方法的返回值0代表相等,1表示大于,-1表示小于;为什么

在简单例子中没有看到实现Comparable接口呢?是因为Integer类其实自己已经实现

了Comparable接口,Java已经给我们做好了。

Collections提供的第二种排序方法sort(ListT list, Comparator? super T c)

先看例子:

package core.java.collection.collections;

public class Students {

private int age;

private int score;

public Students(int age, int score){

super();

this.age = age;

this.score = score;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

}

public static void main(String[] args) {

ListStudents students = new ArrayListStudents();

students.add(new Students(23, 100));

students.add(new Students(27, 98));

students.add(new Students(29, 99));

students.add(new Students(29, 98));

students.add(new Students(22, 89));

Collections.sort(students, new ComparatorStudents() {

@Override

public int compare(Students o1, Students o2) {

int i = o1.getScore() - o2.getScore();

if(i == 0){

return o1.getAge() - o2.getAge();

}

return i;

}

});

for(Students stu : students){

System.out.println("score:" + stu.getScore() + ":age" + stu.getAge());

}

}

输出结果:

score:89:age22

score:98:age27

score:98:age29

score:99:age29

score:100:age23

从上面的例子我们可以看出Students类没有实现ComparableT接口,只是在sort()方法

中多传入一个参数,只不过该参数是一个接口我们需要实现其compare方法。

以上就是是Java中Colelctions工具类为我们提供的两种集合排序方法。

(责任编辑:IT教学网)

更多

推荐SQL Server文章