CodeGym /Java 博客 /随机的 /Java 集合排序()
John Squirrels
第 41 级
San Francisco

Java 集合排序()

已在 随机的 群组中发布
作为处理数据的开发人员,我们需要的最常见功能之一是排序——通过能够对数据进行排序,我们可以优化我们的算法以更快地运行,并在它需要的时间的一小部分内找到它需要的数据否则会采取。在今天的课程中,我们将讨论 Java 集合 sort()。作为一个快速的思维实验:假设您正在通过一所大学的花名册搜索一个名字。这所学校可能有数万名学生。如果给你的花名册不是按字母顺序排列的,你需要翻阅每一页并非常仔细地查看以确保你没有在任何地方跳过一个名字,直到你最终找到你要找的名字。另一方面,如果花名册是按字母顺序排列的,你不仅可以不那么严格地进行搜索,但是你可以很容易地跳到花名册中首字母相同的部分,然后继续大跃进地跳到页面上,直到你找到你要找的人。您处理的数据越多,尽可能有效和高效地使用它就越重要。在本文中,我们将介绍如何使用 Collections 排序方法对 Java 中的任何 List 实现(包括 ArrayList)进行排序。

如何使用 Java 集合排序方法对 Java 中的 ArrayList 进行排序

让我们谈谈 Java Collections.sort 方法。java.util 包包含许多有用的实用程序和包,开发人员经常使用这些实用程序和包,包括 ArrayList。假设您有以下简单程序:

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
您希望能够打印出颜色列表,但要按字母顺序排列。你会怎么做?使用 java.util.Collections,排序就像一行代码一样简单:

Collections.sort(colors);
哒哒!您的颜色列表现已就地排序。如果你要打印出列表,像这样:

System.out.println(colors);
然后你会得到以下输出:

[Blue, Green, Orange, Red]
谈何容易?!使用 Collections.sort() 将整数、浮点数或与此相关的任何其他简单数据类型的列表按升序排序同样容易。但是如果你想按降序排序怎么办?在某些情况下,这肯定是有意义的——想象一下,你有一个特定班级的考试成绩列表,你想找出谁是得分最高的学生。将列表按降序排序(最高分在前)会更有意义,这样您要查找的答案就在顶部。值得庆幸的是,Collections.sort() 被可选的第二个参数覆盖,它允许您这样做:

sort(List l, Comparator c)
但什么是比较器?好吧,比较器只是一个函数,它比较两个输入并返回一个数字,表示哪个输入先出现。如果您正在对原始数据类型的 ArrayList 进行排序,那么 Java Collections 已经为您提供了一个 reverseOrder() 比较器。可以这样调用:

Collections.sort(colors, Collections.reverseOrder());
现在,颜色已就地反向排序,因此如果您将其打印出来,您将获得以下输出:

[Red, Orange, Green, Blue]

如何使用 Collections 对 Java 中的非原始数据类型进行排序

到目前为止,您已经看到在 Java 中使用Collections.sort()方法对字符串或整数的 ArrayList 进行排序就像一行代码一样简单。但通常情况下,您的 ArrayList 将存储非原始数据类型。当您处理具有更复杂属性的数据时,您将希望编写类来表示这些对象以及如何使用它们的属性将它们相互比较。为了探索这方面的示例,让我们重新审视对颜色列表进行排序的示例,但这一次,我们将对 Color 对象进行排序,而不是对字符串进行排序。我们的基本 Color 类可能看起来像这样:

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
为了使我们的 Color 类与 Collections.sort() 兼容,使 Collections 能够理解如何对 Color 对象进行比较和排序,我们需要做两个小的修改:
  1. 使 Color 成为 Comparable 对象(添加实现 Comparable<Object>)
  2. 覆盖类中的 compareTo 方法(覆盖 public int compareTo(Object o))
通过这些修改,我们的类现在看起来像这样:

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
请注意,Color 的 compareTo 方法只是调用 String 的 compareTo 方法;排序将按字母顺序进行。例如,如果我们想按红色值升序排序,我们可以将 return 语句替换为 return this.r - cr; (如果我们想按绿色值降序排序,那就是 return cg - this.g;)。现在,如果我们调用

Collections.sort(colors);
在颜色的 ArrayList 而不仅仅是字符串上,它会起作用,因为 Collections 了解如何比较 Color 对象。如果您不想让您的对象实现 Comparable<Object>,您也可以为您的类编写一个比较器,并将其传递给 2 参数 Collections.sort() 方法。比较器覆盖方法 public int compare(Object one, Object two),Collections.sort() 方法使用它在排序时比较对象。下面实现了 SortByName 和 SortByRed 比较器的示例:

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
有了这个,你现在可以打电话

Collections.sort(colors, new SortByName());
如果没有 Color 类实际实现 Comparable,它仍然可以工作。 有时,您会看到这是使用 lambda 函数在线完成的。lambda 函数本质上是一个无名函数,您可以在调用它的代码行中定义它。当您只需要为一个特定实例调用一个函数而不想在别处定义一个完整的单独函数时,它们很有用。SortByName 比较器可以使用 lambda 函数在线定义,如下所示:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
您可能已经猜到了,(a, b) 表示 lambda 函数的参数(要比较的两个对象)。-> 表示后面是 lambda 函数定义。就是这样!您现在已经了解了使用 Collections 包在 Java 中对 ArrayList 进行排序的最流行方法。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION