一 大小比较
1.comparable
问题:1.当前的自定义类,要根据什么规则进行大小的比较?
2.这个规则怎么定义?
public class Student implements Comparable<Student>{
public Student(String name, int age){
this.name=name;
this.age=age;
}
public String name;
public int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main1(String[] args) {
Student student1=new Student("zhangsan",12);
Student student2=new Student("lisi",8);
System.out.println(student1 > student2);
}
}
无法进行比较,因为无法区分是年龄还是姓名的比较,比较的是地址,那么我们就要借用 comparable来进行比较
public class Student implements Comparable<Student>{
public Student(String name, int age){
this.name=name;
this.age=age;
}
public String name;
public int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
/* if(this.age>o.age){
return 1;
}else if(this.age==o.age){
return 0;
}else {
return -1;
}*/
//return this.age - o.age;
return this.name.compareTo(o.name);
}
}
public static void main(String[] args) {
Student student1=new Student("zhangsan",12);
Student student2=new Student("lisi",8);
System.out.println(student1.compareTo(student2));
}
通过学生这个类来实现 comparable这个接口,然后再重写comparable这个接口里面的compareTo方法,进行比较。
看一下comparable的源代码

1.1年龄的比较
public int compareTo(Student o) {
/* if(this.age>o.age){
return 1;
}else if(this.age==o.age){
return 0;
}else {
return -1;
}*/
return this.age - o.age;
}
}
1.2姓名的比较
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
}
让我们来自己实现一个排序,了解一下排序是怎么做的。
public static void mySort(Comparable[] comparable){
for (int i = 0; i<comparable.length-1; i++) {
for (int j = 0; j < comparable.length - 1 - i; j++) {
if(comparable[j].compareTo(comparable[j+1])>0) {
Comparable tem = comparable[j];
comparable[j] = comparable[j + 1];
comparable[j + 1] = tem;
}
}
}
}
2.Comparator
但是 使用comparable只能进行单一的比较,所以我们可以使用Comparator,定义两个类AgeComparator和NameComparator分别实现Comparator接口
看一下Comparator接口的源代码
public class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.age-o2.age;
}
}
public class NameComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.name.compareTo(o2.name);
}
}
public static void main4(String[] args) {
Student[] students=new Student[3];
students[0]=new Student("zhangsan",12);
students[1]=new Student("afs",19);
students[2]=new Student("lisi",8);
System.out.println("排序前"+ Arrays.toString(students));
AgeComparator ageComparator=new AgeComparator();
Arrays.sort(students,ageComparator);
System.out.println("年龄排序后"+Arrays.toString(students));
NameComparator nameComparator=new NameComparator();
Arrays.sort(students,nameComparator);
System.out.println("姓名排序后"+Arrays.toString(students));
}
由于Java语法非常灵活,我们也可以用这种方法来接受
public static void main3(String[] args) {
Student student1=new Student("zhangsan",12);
Student student2=new Student("lisi",8);
AgeComparator ageComparator=new AgeComparator();
int ret=ageComparator.compare(student1,student2);
System.out.println(ret);
}
二 两个数值的交换
在之前的学习中,如果我们要把两个数的值交换,我们会这样做
public class Test {
public static void chat(int x,int y){
int tem=x;
x=y;
y=tem;
}
public static void main(String[] args) {
int a=10;
int b=20;
chat(a,b);
System.out.println(a+" "+b);
}
}
但是我们可以发现他们的值没有任何变化
我们可以通过图像来观察
但是我们可以用封装的方法
class MyNum{
public int num;
}
public class Test {
public static void chatNum(MyNum myNum1,MyNum myNum2){
int tem=myNum1.num;
myNum1.num=myNum2.num;
myNum2.num=tem;
}
public static void main(String[] args) {
MyNum myNum1=new MyNum();
MyNum myNum2=new MyNum();
myNum1.num=10;
myNum2.num=200;
System.out.println(myNum1.num);
System.out.println(myNum2.num);
System.out.println("------");
chatNum(myNum1,myNum2);
System.out.println(myNum1.num);
System.out.println(myNum2.num);
}
过程如图所示
希望能对大家有所帮助!!!!

被折叠的 条评论
为什么被折叠?



