Collections.sort()的详细讲解

Collections.sort()的详细讲解Collections.sort()的详细讲解很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map,Set,List等集合中。他们都提供了一个排序方法sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是可比较的。怎么让一个对象是可比较的,那就需要该对象实现Comparable接口啦。然后重写里面的compareTo()方法。我们可以看到Java中很多类都是实现类这个接口的如:Integer,Long等假设我们有一个学生类,默认需

Collections.sort()的详细讲解

很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提供了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是 可比较的。
怎么让一个对象是 可比较的,那就需要该对象实现 Comparable 接口啦。然后重写里面的
compareTo()方法。我们可以看到Java中很多类都是实现类这个接口的 如:Integer,Long 等
假设我们有一个学生类,默认需要按学生的年龄字段 age 进行排序 代码如下:

package bag;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Student implements Comparable<Student>{ 
   
    int id;
    int age;
    String name;
    public Student(int id,int age,String name) { 
   
		// TODO 自动生成的构造函数存根
    	this.id = id;
    	this.age = age;
    	this.name = name;
	}
    //以下方法三个均是为了该类的封装性
    public int getId() { 
   
		return id;
	}
    
    public int getAge() { 
   
		return age;
	}
    
    public String getName() { 
   
		return name;
	}
    //便于返回每个对象的信息
    public String toString() { 
   
    	return "Student{"+"id="+id+", age="+age+", name= "+name+"}";
    	}
   //重点:重写该方法定义排序方式 @Override
	public int compareTo(Student o) { 
   
		// TODO 自动生成的方法存根
		//return this.age - o.age;//按升序排列
		return o.age - this.age;//按降序排列
	}

	public static void main(String[] args) { 
   
		// TODO 自动生成的方法存根
ArrayList<Student> s = new ArrayList<Student>();
Student s1 = new Student(1,24,"1");
Student s2 =new Student(4,23,"2");
Student s3 =new Student(2,22,"3");
Student s4 = new Student(3,25,"4");
Student s5 = new Student(5,24,"5");
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);

System.out.println("排序前");
for (Student student : s) { 
   
	System.out.println(student.toString());
}

Collections.sort(s);
//第一种方法根据age来排序
System.out.println("默认排序");
for (Student student : s) { 
   
	System.out.println(student.toString());
}

//第二种方法根据id来排序
/*Collections.sort(s, new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { // TODO 自动生成的方法存根 //以下两种方法均可,但第二种破坏了封装性,故不采用 return s1.getId() - s2.getId(); //return s1.id-s2.id; } });*/
//第三种方法根据id来排序
s.sort(new Comparator<Student>() { 
   //使用匿名类
//这样实现接口不用再专门写一格实现类了。
	public int compare(Student s1, Student s2) { 
   
		// TODO 自动生成的方法存根
		//return s1.getId() - s2.getId();//升序
		return s2.getId() - s1.getId();//降序
	}
});
System.out.println("排序后");
for (Student student : s) { 
   
	System.out.println(student.toString());
}

	}

	

}

这里说一下重写的 public int compareTo(Student o){} 这个方法,它返回三种 int 类型的值: 负整数,零 ,正整数
返回值的含义
负整数 : 当前对象的值 < 比较对象的值 , 位置排在前
零 :当前对象的值 = 比较对象的值 , 位置不变
正整数 : 当前对象的值 > 比较对象的值 , 位置排在后

比较器的使用 Comparator
默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了。

Comparator 的使用有两种方式:
Collections.sort(list,Comparator);
list.sort(Comparator);
这两种方法中的Student不需要继承接口Comparable。
除了用匿名类实现外,还可以用内部类实现。如下

package bag;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Human { 
   
	private String name;
	
	private int age;

	public Human() { 
   

	}

	public Human(String name, int age) { 
   

	this.name = name;

	this.age = age;

	}

	public String getName() { 
   

	return name;

	}

	public void setName(String name) { 
   //该方法方便初始化之后可以更改相关值

	this.name = name;

	}

	public int getAge() { 
   

	return age;

	}

	public void setAge(int age) { 
   

	this.age = age;

	}

	
   //这种初始的方法可以留意一下
	public static List<Human> getAInitHumanList() { 
   

	return new ArrayList<Human>() { 
   

	{ 
   

	add(new Human("guorao", 10));

	add(new Human("mako", 12));

	add(new Human("hel", 30));

	add(new Human("lin", 28));

	}

	};

	}

	@Override

	public String toString() { 
   

	return this.getName() + ":" + this.getAge();

	}
	
	public class HumanComparetor implements Comparator<Human> { 
   //内部类

		@Override

		public int compare(Human h1, Human h2) { 
   

		if (h1.getAge() > h2.getAge()) { 
   

		return 1;

		} else if (h1.getAge() == h2.getAge()) { 
   

		return 0;

		} else { 
   

		return -1;

		}

		}

		}
	

	public static void main(String[] args) { 
   
		// TODO 自动生成的方法存根
		List<Human> humans = Human.getAInitHumanList();
      + Collections.sort(humans, new HumanComparetor());
      /* 如果使用+处的代码,则会出现以下编译提示 *没有任何类型 Human 的外层实例可访问。 *必须用类型 Human 的外层实例(例如,x.new A(), *其中 x 是 Human 的实例)来限定分配。 *所以应替换成如下+处的代码这是内部类调用的规则 *先创建一个外部类实例,再通过该实例实例化内部类 *Human human1 = new Human(); * HumanComparetor h = human1.new HumanComparetor();即可调用内部类的方法与实例变量*/ 
    +Human human1 = new Human();
	+Collections.sort(humans, human1.new HumanComparetor());
          for (Human human : humans) { 
   
		System.out.println(human.toString());
              }
		}
	}



方法的局部使用局部类

package bag;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Human { 
   
	private String name;
	
	private int age;

	public Human() { 
   

	}

	public Human(String name, int age) { 
   

	this.name = name;

	this.age = age;

	}

	public String getName() { 
   

	return name;

	}

	public void setName(String name) { 
   //该方法方便初始化之后可以更改相关值

	this.name = name;

	}

	public int getAge() { 
   

	return age;

	}

	public void setAge(int age) { 
   

	this.age = age;

	}

	
   //这种初始的方法可以留意一下
	public static List<Human> getAInitHumanList() { 
   

	return new ArrayList<Human>() { 
   

	{ 
   

	add(new Human("guorao", 10));

	add(new Human("mako", 12));

	add(new Human("hel", 30));

	add(new Human("lin", 28));

	}

	};

	}

	@Override

	public String toString() { 
   

	return this.getName() + ":" + this.getAge();

	}
	
	

		
	

	public static void main(String[] args) { 
   
		// TODO 自动生成的方法存根
		List<Human> humans = Human.getAInitHumanList();
		 class HumanComparetor implements Comparator<Human> { 
   //内部类,该类前的限制符不可为public,只能为抽象与终极态

			@Override

			public int compare(Human h1, Human h2) { 
   

			/*if (h1.getAge() > h2.getAge()) { return 1; } else if (h1.getAge() == h2.getAge()) { return 0; } else { return -1; }*/
			//两种均可均是升序
           return h1.getAge() - h2.getAge();
			}
				
		 }
			
        
		Collections.sort(humans, new HumanComparetor());
          for (Human human : humans) { 
   
		System.out.println(human.toString());
              }
		}
	}



今天的文章Collections.sort()的详细讲解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12640.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注