众所周知, Java中基本上有两种排序技术:
- 首先是内部排序,即使用预定义的排序方法升序排列Arrays.sort()用于原始类数组和包装类数组,而Collections.sort()用于集合,这两种方法都按升序对元素进行排序。
- 第二种技术是使用类中的比较器或可比较接口对元素进行排序。
- 比较器接口:在类中实现比较器接口并覆盖 compare() 方法或将新的比较器作为排序方法中的第二个参数传递,并根据需要更改排序顺序。 Comparator 仅适用于包装类型数组和像 vector、ArrayList 等的集合。
- Comparable Interface:这个接口实现了单一的排序技术,它影响整个类。可比较的接口提供了一个 compareTo() 方法来对元素进行排序。
总而言之,在Java,如果对象的排序需要基于自然顺序,那么使用 Comparable 接口的 compareTo() 方法。对于整数,默认的自然排序顺序是升序,而对于字符串,它是按字母顺序排列的。然而,如果您需要对不同对象的属性进行排序,或者自定义排序,则使用 Comparator 接口的 compare()。
覆盖compareTo() 方法
为了首先根据操作的需要改变对象的排序,我们必须在类中实现一个 Comparable 接口并覆盖 compareTo() 方法。由于我们必须对对象数组进行排序,传统的array.sort()方法将不起作用,因为它曾经对原始类型起作用,所以当我们调用Arrays.sort()方法并传递对象数组时,它会搜索,无论我们是否覆盖了 compareTo() 方法。由于我们已经覆盖了 compareTo() 方法,因此将使用这个 compareTo() 方法根据年龄比较对象。
Java
// Java Program to show how to override the compareTo()
// method of comparable interface
import java.util.*;
// implementing Comparable interface
public class GFG implements Comparable {
String name;
int age;
// Class constructor
GFG(String name, int age)
{
this.name = name;
this.age = age;
}
public int getage() { return age; }
public String getname() { return name; }
public static void main(String[] args)
{
// Creating GFG class object
GFG ob[] = new GFG[4];
// Inserting elements in the objects
ob[0] = new GFG("Aayush", 14);
ob[1] = new GFG("Ravi", 12);
ob[2] = new GFG("Sachin", 19);
ob[3] = new GFG("Mohit", 20);
// sort the array,using overriden method
Arrays.sort(ob);
for (GFG o : ob) {
// printing the sorted array objects name and
// age
System.out.println(o.name + " " + o.age);
}
// if you want to create a dynamic array ,then you
// can create an arraylist
ArrayList objects = new ArrayList<>();
// creating a new GFG object
GFG newObject1 = new GFG("Rohan Devaki", 20);
// inserting the new object into the arraylist
objects.add(newObject1);
// creating a new GFG object
GFG newObject2 = new GFG("Algorithammer", 22);
// inserting the new object into the arraylist
objects.add(newObject2);
// using Collections to sort the arraylist
Collections.sort(objects);
for (GFG o : objects) {
// printing the sorted objects in arraylist by
// name and age
System.out.format("%s %d\n", o.name, o.age);
}
}
// Overriding compareTo() method
@Override public int compareTo(GFG o)
{
if (this.age > o.age) {
// if current object is greater,then return 1
return 1;
}
else if (this.age < o.age) {
// if current object is greater,then return -1
return -1;
}
else {
// if current object is equal to o,then return 0
return 0;
}
}
}
输出
Ravi 12
Aayush 14
Sachin 19
Mohit 20
Rohan Devaki 20
Algorithammer 22