list对象排序(对list集合进行排序)
如何对List中的对象进行排序
list
是你要排序的。
Collections
是集合的公共类,提供各种工具,其中提供了排序方法。
Collections.sort(),方法两个参数,1,要排序的集合,2.排序方式
下面是匿名内部类,实现了排序借口,你也可以写外面。
Comparator
c=new
Comparator()
如何对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 排序
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工具类为我们提供的两种集合排序方法。
如何对List集合中的对象进行排序?
看你list里面装的是什么对象了,普通的整数或字符串对象ArrayList.sort() 应该就可以了,如果是自定义的对象,可以先用对象实现Comparable接口
如何实现按照List集合中对象某个属性排序
给集合排序 ,常见的方法是给集合提供1个比较器Comparator.
import?java.util.*;
class?Stu{//学生类
String?name;
int?age;
public?Stu(String?name,int?age)?{
this.name?=?name;
this.age=age;
}
@Override
public?String?toString()?{
return?"姓名:"+name+"?年龄:"+age;
}
}
public?class?Test?{
public?static?void?main(String[]?args)?{
ArrayListStu?list?=?new?ArrayListStu();
list.add(new?Stu("jack",12));
list.add(new?Stu("lily",13));
list.add(new?Stu("lucy",15));
list.add(new?Stu("tom",11));
System.out.println(list);
//给集合排序
list.sort(new?ComparatorStu()?{//Comparator?比较器.?需要实现比较方法
@Override
public?int?compare(Stu?o1,?Stu?o2)?{
return?o1.age-o2.age;//从小到大?,?如果是o2.age-o1.age?则表示从大到小
}
});
System.out.println(list);
}
}
输出
[姓名:jack?年龄:12,?姓名:lily?年龄:13,?姓名:lucy?年龄:15,?姓名:tom?年龄:11]
[姓名:tom?年龄:11,?姓名:jack?年龄:12,?姓名:lily?年龄:13,?姓名:lucy?年龄:15]