JAVA中的sort排序

C++中提供了sort函数,可以让程序员轻松地调用排序算法,JAVA中也有相应的函数。

1.基本元素排序:Array.sort(排序数组名)

package test;
import java.util.*;

public class main
{
	public static void main(String args[])
	{
		Scanner cin=new Scanner(System.in);
		int a[];
		int i;
		a=new int[5];
		for (i=0;i<=4;i++)
		{
			a[i]=cin.nextInt();
		}
		Arrays.sort(a);
		for (i=0;i<=4;i++)
		{
			System.out.println(a[i]+" ");
		}
	}
}

2.基本元素从大到小排序:

由于要用到sort中的第二个参数,这个参数是一个类,所以应该用Integer,而不是int。可以使用Interger.intvalue()获得其中int的值

下面a是int型数组,b是Interger型的数组,a拷贝到b中,方便从大到小排序。capare中返回值是1表示需要交换。

package test;
import java.util.*;

class Mycomparator implements Comparator<Integer>
{
	public int compare(Integer a,Integer b)
	{
		if (a>b)
		{
			return -1;
		}
		else if (a<b)
		{
			return 1;
		}
		return 0;
	}
}

public class main
{
	public static void main(String args[])
	{
		Scanner cin=new Scanner(System.in);
		int a[];
		Integer b[];
		int i;
		a=new int[5];
		b=new Integer[5];
		for (i=0;i<=4;i++)
		{
			a[i]=cin.nextInt();
			b[i]=new Integer(a[i]);
		}
		Comparator<Integer> cmp=new Mycomparator();
		Arrays.sort(b,cmp);
		for (i=0;i<=4;i++)
		{
			System.out.println(b[i].intValue()+" ");
		}
	}
}

3.类排序。

和2差不多,都是重载比较器,以下程序实现了点的排序,其中x小的拍前面,x一样时y小的排前面

package test;
import java.util.*;

class point 
{
	int x,y;
	public String toString()
	{
		return "x="+x+" "+"y="+y;
	}
}

class pointComparator implements Comparator<point>
{
	public int compare(point a,point b)
	{
		if (a.x>b.x)
		{
			return 1;
		}
		else if (a.x<b.x)
		{
			return -1;
		}
		else
		{
			if (a.y>b.y)
			{
				return 1;
			}
			else if (a.y<b.y)
			{
				return -1;
			}
		}
		return 0;
	}
}

public class main
{
	public static void main (String[] args)
	{
		Scanner cin=new Scanner(System.in);
		int i,b;
		point a[]=new point[5];
		for (i=0;i<=4;i++)
		{
			a[i]=new point();
			a[i].x=cin.nextInt();
			a[i].y=cin.nextInt();
		}
		Comparator<point> cmp=new pointComparator();
		Arrays.sort(a,cmp);
		for (i=0;i<=4;i++)
		{
			System.out.println(a[i]);
		}
	}
}


4.区间排序

如果只希望对数组中的一个区间进行排序,那么就用到sort中的第二个和第三个参数sort(a,p1,p2,cmp),表示对a数组的[p1,p2)(注意左闭右开)部分按cmp规则进行排序

<think>好的,我现在需要帮助用户了解如何在Java中自定义sort排序函数,特别是实现Comparator接口的示例。首先,我得回忆一下Java中的排序机制。用户提到了Comparator和Comparable,这两个接口的区别是关键。Comparable是让类自身实现比较,而Comparator是外部比较器,可以在不修改类的情况下定义多种排序方式。用户的问题主要集中在Comparator上,所以应该详细讲解如何实现它。 接下来,用户需要一个示例。我需要构造一个简单的场景,比如一个学生类,然后根据年龄或姓名排序。这样用户容易理解。步骤应该包括:创建自定义类、实现Comparator接口、重写compare方法,然后使用Collections.sort或list.sort进行排序。 还要注意代码的格式和注释,确保清晰。比如,展示匿名内部类和Lambda表达式两种方式,这样用户知道不同的实现方法。同时,要提到Comparator的链式调用,比如thenComparing,这对多条件排序很有用。 然后,检查是否有遗漏点。比如,比较的返回值规则:负数、零、正数分别代表小于、等于、于。需要明确说明,避免用户混淆。此外,提醒用户区分Comparable和Comparator的应用场景,虽然用户主要问Comparator,但简要对比有助于加深理解。 用户提供的引用资料中提到Arrays.sort和Collections.sort,以及Comparator接口的compare方法,这些都需要在回答中引用。例如,在代码示例部分,可以引用[^2]和[^4],说明如何实现自定义排序规则。 最后,生成相关问题,确保符合用户的要求。问题可以涉及不同数据类型的排序、降序排列、多条件排序等,帮助用户进一步探索。同时,确认所有数学表达式和公式的格式是否正确,虽然这个问题可能不涉及太多数学内容,但如果有变量名之类的,需要用$符号包裹。 总结步骤:解释Comparator的作用,给出学生类的例子,展示两种实现方式(匿名类和Lambda),说明compare方法的返回值,演示如何使用sort方法,引用相关资料,最后生成相关问题。这样结构清晰,逐步引导用户理解和应用自定义排序方法。</think>在 Java 中自定义排序可通过实现 `Comparator` 接口完成。以下是具体实现步骤和示例: --- ### 一、实现 Comparator 接口的步骤 1. **定义需要排序的类** 例如创建一个 `Student` 类: ```java public class Student { private String name; private int age; // 构造方法、getter/setter 省略 } ``` 2. **实现 Comparator 接口** 通过匿名内部类或 Lambda 表达式定义排序规则: ```java // 匿名内部类方式 Comparator<Student> ageComparator = new Comparator<>() { @Override public int compare(Student s1, Student s2) { return Integer.compare(s1.getAge(), s2.getAge()); // 按年龄升序 } }; // Lambda 表达式方式(Java 8+) Comparator<Student> nameComparator = (s1, s2) -> s1.getName().compareTo(s2.getName()); ``` 3. **应用排序** 使用 `Collections.sort()` 或 `List.sort()`: ```java List<Student> students = new ArrayList<>(); // 添加学生对象... // 按年龄排序 students.sort(ageComparator); // 按姓名排序 Collections.sort(students, nameComparator); ``` --- ### 二、完整代码示例 ```java import java.util.*; public class CustomSortDemo { public static void main(String[] args) { List<Student> students = Arrays.asList( new Student("Alice", 20), new Student("Bob", 18), new Student("Charlie", 22) ); // 按年龄升序排序 students.sort(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { return Integer.compare(s1.getAge(), s2.getAge()); } }); // 按姓名降序(Lambda 实现) students.sort((s1, s2) -> s2.getName().compareTo(s1.getName())); // 输出结果 students.forEach(s -> System.out.println(s.getName() + ": " + s.getAge())); } } class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` --- ### 三、核心规则说明 1. **`compare()` 返回值逻辑** - 返回负数:`o1` 排在 `o2` 前面 - 返回正数:`o1` 排在 `o2` 后面 - 返回 0:视为相等 2. **多条件排序** 使用 `thenComparing()` 实现链式排序: ```java Comparator<Student> complexComparator = Comparator .comparingInt(Student::getAge) // 先按年龄升序 .thenComparing(Student::getName); // 再按姓名升序 ``` --- ### 四、Comparable vs Comparator - **Comparable**:对象自身实现比较逻辑(需修改类)[^3] - **Comparator**:外部定义灵活比较规则(无需修改类)[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值