如何用Java对列表进行排序

时间:2020-02-23 14:36:51  来源:igfitidea点击:

有时我们必须在Java中对列表进行排序,然后再处理其元素。
在本教程中,我们将学习如何以自然顺序对列表进行排序。
我们还将学习如何使用我们自己的Comparator实现对对象列表进行排序。

Java List与数组相似,不同之处在于列表的长度是动态的,并且在Java Collection框架中。
实际上,List是一个接口,大多数时候我们使用其实现之一,例如ArrayList或者LinkedList等。

Java排序列表

其中我们将学习如何对Java中的对象列表进行排序。
我们可以使用Collections.sort()方法以自然的升序对列表进行排序。
列表中的所有元素必须实现Comparable接口,否则会抛出IllegalArgumentException

让我们看一个简单的示例,对字符串列表进行排序。

package com.theitroad.sort;

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

public class JavaListSort {

  /**
   * This class shows how to sort ArrayList in java
   * @param args
   */
  public static void main(String[] args) {
      List<String> strList = new ArrayList<String>();
      strList.add("A");
      strList.add("C");
      strList.add("B");
      strList.add("Z");
      strList.add("E");
      //using Collections.sort() to sort ArrayList
      Collections.sort(strList);
      for(String str: strList) System.out.print(" "+str);
  }

}

如您所见,我们正在使用Collections.sort()方法对字符串列表进行排序。
String类实现Comparable接口。

Java对象排序列表

让我们看另一个示例,在该示例中我们将对自定义对象列表进行排序。
请注意,该类必须实现Comparable接口。

package com.theitroad.sort;

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

public class JavaSortListObject {

	public static void main(String[] args) {
		List<Data> dl = new ArrayList<>();
		dl.add(new Data(2));
		dl.add(new Data(3));
		dl.add(new Data(1));
		System.out.println("Original List::"+dl);
		Collections.sort(dl);
		System.out.println("Naturally Sorted List::"+dl);

	}

}

class Data implements Comparable<Data> {

	private int id;

	public Data(int i) {
		this.id = i;
	}

	@Override
	public int compareTo(Data d) {
		return this.id - d.getId();
	}

	public int getId() {
		return id;
	}

	@Override
	public String toString() {
		return "Data{"+this.id+"}";
	}
}

输出:

Original List::[Data{2}, Data{3}, Data{1}]
Naturally Sorted List::[Data{1}, Data{2}, Data{3}]

使用比较器对Java中的列表进行排序

Collections.sort()方法已重载,我们还可以提供自己的Comparator实现来对规则进行排序。

由于Comparator是功能性接口,因此我们可以使用lambda表达式在一行中编写其实现。

Collections.sort(dl, (d1, d2) -> {
	return d2.getId() - d1.getId();
});
System.out.println("Reverse Sorted List using Comparator::" + dl);