Java对List集合的排序

由于其功能性和灵活性,ArrayList是
Java 集合框架中使用最为普遍的集合类之一。ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减。

使用Collections工具类进行排序:

使用Collections排序非常简单,我们只需要把实现了Comparable接口的类传入里面调用一下Collections.sort()
方法就可以对其进行排序了。

一般使用这个方法最多的就是对string和Integer进行排序,因为他们内部都很好的实现了Comparable化这个接口。

 public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

compareTo这个方法放到后面再细说。现在我们来检验一下Collections.sort对字符串的排序。

Collections.sort(list,
new PriceComparator());的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。

public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("c");
		list.add("b");
		list.add("8d");
		Collections.sort(list);
		System.out.println(list);
	}

内部的排序方法是按照字母的顺序一个一个来比较的,比如上面这段代码,打印的结果是[8d,
b, c],这里按说8d要比c大,但是8d却排在最前面,因为他只对比首位,只有首位相同的时候,才会按照位数依次往下比较;比如下面这段代码:

public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("a1");
		list.add("a2aaaaaaaa");
		list.add("a3aaaa");
		Collections.sort(list);
		System.out.println(list);
	}

结果为:[a1,
a2aaaaaaaa, a3aaaa]

使用Comparable排序ArrayList

Comparable 是带有单一 compareTo()方法的接口。一个实现了 Comparable
接口的类对象可以与其它同类型的对象进行比较,实现 Comparable 接口的类需要重写 compareTo()方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。compareTo()方法返回Int类型的比较结果,分别代表下面的含义:

正值表示当前对象比传递给 comPareTO()的对象大

负值表示当前对象比传递给 comPareTO()的对象小

零表示两个对象相等

举一个例子,假如我们现在有一个Student类,类里面有两个变量,一个名称,一个年龄,假如我们需要按年龄进行排序的话,就需要重写comPareTO()这个方法;

public class Student implements Comparable{
	private String name;
	private Integer age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	public Student() {
		super();
	}
	@Override
	public int compareTo(Object o) {
		return (this.getAge() < ((Student) o).getAge() ? -1 :
			 (this.getAge() == ((Student) o).getAge() ? 0 : 1));
	}

上面我们实现了基于年龄的比较,有很多人喜欢将(this.getAge()
–((Student) o).getAge())作为返回的比较结果。尽管使用这种 return 语句看上去似乎很吸引人,并且也不会对我们的例子造成影响,我的建议是远离这种语句。想象一下,比较整数值,其中有一个或者两个都是负数的结果。这会导致一些错误,让你的程序行为不定,而且更重要的是,这样的错误是很细微的,尤其是在大型的企业应用中很难检测出来。

使用 Comparator 排序 ArrayList

Comparator 接口与Comparable 接口相似也提供了一个单一的比较方法叫作 compare()。然而,与 Comparable的 compareTo()方法不同的是,这个
compare()接受两个同类型的不同对象进行比较。

public class Student{
	private String name;
	private Integer age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	public static Comparator ageComparator = new Comparator() {
		 @Override
		public int compare(Object o1, Object o2) {
			 return ( ((Student) o1).getAge() < ((Student) o2).getAge() ? -1 :
			 (((Student) o1).getAge() ==((Student) o2).getAge() ? 0 : 1));
			 }
		 };
	public Student() {
		super();
	}
	public static void main(String[] args) {
		Student s=new Student();
		s.setName("张三");
		s.setAge(17);
		Student st=new Student();
		st.setName("李四");
		st.setAge(-1);
		List<Student> list=new ArrayList<Student>();
		list.add(s);
		list.add(st);
		Collections.sort(list,ageComparator);
		System.out.println(list);
	}

}

总结:有很多人倾向于不要使用接口,因为这样会提高类的耦合度,选择方法一直是我们所纠结的地方,其实一个
使用Comparable 对象可以说“我可以自己与另外一个对象比较”而一个使用 Comparator 对象可以说“我可以比较两个不同的对象”。你不能说一个接口比另一个要好。选择的接口取决于你需要实现的功能。

时间: 2024-12-29 06:07:04

Java对List集合的排序的相关文章

java中list集合的内容,如何使用像数据库中group by形式那样排序

java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    money(名称)  (金额) 来源A   100来源B   200来源C   300来源B   6600来源A   99800<数据1> 最后想实现的是:如果假设这些数据在数据库中,那么通过 select name,sum(money) from Table group by name 该语句得到的Li

Java 中List集合中自定义排序

/* 集合框架的工具类. Collections:集合框架的工具类.里面定义的都是静态方法. Collections和Collection有什么区别? Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法. 它有两个常用的子接口, List:对元素都有定义索引.有序的.可以重复元素. Set:不可以重复元素.无序. Collections是集合框架中的一个工具类.该类中的方法都是静态的 提供的方法中有可以对list集合进行排序,二分查找等方法. 通常常用的集合都是线程不

java课堂笔记------集合api

Collection c = new ArrayList(); * boolean add(E e) * 将当前集合中添加给定的元素 * 若成功添加则返回true c.add("one"); c.add("two"); * int size() * 获取当前集合中的元素个数 c.size(); * boolean isEmpty() * 判断当前集合是否不包含任何元素 * 当集合中没有元素时返回true boolean isEmpty = c.isEmpty();

java基础之集合框架总结篇

(一).java集合框架轮廓(图片来自网络):下面两张图能说整个集合框架的层次和结构! (ps)这里的很多总结是我把某培训机构视频全部看了,发现老师总结的很好就把它贴在这里了,权当自己在写代码时不记得给自己一个提醒作用. (二).Collection集合总结 Collection                 |--List 有序,可重复                       |--ArrayList                              底层数据结构是数组,查询快,

学java教程之集合框架

学编程吧学编程学IT教程之java教程集合框架发布了,欢迎通过xuebiancheng8.com来访问 java中的集合框架故名思议就是针对集合的框架.那什么是集合呢,前面已经学习过数组,没错,数组就是一组数据的集合,换句话说数组也是一种特殊的集合框架,可以完成集合的功能.那数组在使用的时候有没有不方便的地方呢,比方说数组有可能有满的时候,满了怎么办,我们是不是得自己写程序来更改数组的大小呢,而且还要把原来的数组赋值到新的数组的原来位置上,这样很明显数组用起来不是特别方便,很多功能得让我们自己去

【JavaSE】day05_List集合_List排序_队列和栈

1.List集合 1)有序集,可重复集.List的特点是可以像数组一样,根据下标操作元素.所以List提供了一些独有的方法. 2)常用实现类: --ArrayList:内部由数组实现,查询快. --LinkedList:内部由链表实现,增删快. 3)E get(int index) 获取指定下标对应的元素.(下标从0开始) 4)E set(int index,E e) 将给定的元素设置到指定的位置上,返回值为原位置上的元素.所以该操作是替换元素操作. 注:需在现有的元素上进行操作. 代码演示:

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

集合的排序

对于没有排序功能的集合来说,都可以使用java.util.Collections.sort()方法进行排序,它除了集合对象以外,还需要提供一个比较器.如果列表中的元素全部都是相同的类型,并且这个类实现了Comparable接口,就可以简单的调用Collections.sort()方法,如果这个类没有实现comparable接口,那么可以创建一个比较器传递一个Comparator实例作为Sort()的第二个参数进行排序,另外,如果不想使用默认的分类顺序进行排序,同样也可以传递一个Comparato

JAVA 16(集合框架工具类)

Collections :工具类,专门对集合进行操作的.所有方法都是静态的,构造方法是私有的,不可以创建对象,通过Collections.xxx();调用工具类中的方法. 1, Collections.sort(); //对集合进行排序,List可以,Set不可以,因为有自动排序的TreeSet,其实是调用对象的Compare方法,如果想要排序自定义对象, sort后面要传入比较器. Collections.sort(list,new Strlen()); 下面有举例说明 2, Collecti