JAVAcomparable的操作方法与案例转载

原创
小哥 3年前 (2022-12-30) 阅读数 142 #大杂烩

comparable :在要排序的类中实现。comparable接口,也就是说,您必须首先在要排序的类中编写一个方法,以声明要根据其对类中的属性进行排序的规则。和Comparator不同,Comparator无需修改要排序的类中的代码。我将在第二篇文章中介绍详细信息。Comparator使用方法。

举个例子-----------------------------------------------------------

我们现在要创建一个TreeSet()存储对象。当您存储的对象是String类型或Integer类型,因为这些类型已实现comparable接口,因此此集合的输出将遵循这些类的重写。compareTo()按顺序输出的方法,类似地,当您自己创建类时,您希望使用TreeSet要存储此对象,必须重写comparable接口的compareTo()方法。

让我们先创建一个person类,其中包含Integer 类型的 age;和String类型的name。

现在我们已经创建了preson类,保存名称和年龄,我们还重写toString方法获取输出对象的年龄(age)和名字(name)

代码中的红色标记是我们的位置person类(机具comparable接口)重写compareTo方法,该方法根据年龄优先级排序,如果年龄相同,我们将比较名称,如果两者相同,则无法保存对象TreeSet表里。

然后我们创建一个测试类TestTreeSet()我们创建了TreeSet对象set来存储person对象。

可以看到我在里面set有很多对象person物体;其中有2同一个对象,让我们运行它们是否都可以保存set里

可以看到,存储了四个,重复 那一个还没有保存,它已经按年龄排序了。

如果你想自己尝试,你可以复制我的代码并运行它。

//向treeset 添加的元素必须属于同一类
//可以按元素添加到集合的顺序遍历元素。
//当向TreeSet添加自定义类的对象时 需要自定义类实现cmparable接口和重写方法
//添加元素时,请先执行以下操作compareto方法返回后进行比较0,
//虽然只有比较的值是相同的,但程序仍然会认为对象是相同的。

import java.util.Set;
import java.util.TreeSet;
//treeset 自然秩序 需要自定义类实现cmparable接口
public class TestTreeSet {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(new person(25,"kk"));
set.add(new person(23,"pp"));
set.add(new person(22,"pp"));
set.add(new person(21,"pp"));
set.add(new person(21,"pp"));
System.out.println(set.size());
for(Object i:set) {
System.out.println(i);
}

}
}

public class person implements Comparable {
Integer age;
String name;

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime result + age;
result = prime
result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
person other = (person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

@Override
public String toString() {
return "person [age=" + age + ", name=" + name + "]";
}

public person() {
super();
}

public person(int age, String name) {
super();
this.age = age;
this.name = name;
}

// 当向TreeSet中添加person根据该方法,类的对象根据该属性排列。
@Override
public int compareTo(Object o) {
if (o instanceof person) {
//ps这里的age name因为是Integer 和String类型,因此已被重写。compareTo方法,我们可以直接使用它。
person p = (person) o;
// return -this.age.compareTo(p.age);
// return this.name.compareTo(p.name);
int i = this.age.compareTo(p.age);
if (i == 0) {
return this.name.compareTo(p.name);//如果age它是一样的,让我们来判断这个名字是否相同。
}else {
return i;
}
}
return 0;//返回的数字为0表示相同的两个元素,正数表示大于,负数表示小于

}


作者:weixin_40214269
来源:CSDN
原文:https://blog.csdn.net/weixin\_40214269/article/details/80266586
版权声明:本文为博主原创文章,转载请附上博客链接!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除