您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第13章:Java类集】_排序及重复元素说明
发布时间:2021-01-02 12:05:53编辑:雪饮阅读()
TreeSet对于自定义类型数据的比较排序
import java.util.TreeSet;
import java.util.Set;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class TestJava{
public static void main(String args[]){
Set<Person> allSet=new TreeSet<Person>();
allSet.add(new Person("kasumi",28));
allSet.add(new Person("ayane",27));
allSet.add(new Person("moniji",29));
allSet.add(new Person("snowDrink",24));
System.out.println(allSet);
}
}
可见TreeSet对数据进行排序的前提是该数据所在类型必须要实现比较器。
所以当我们程序增加比较器之后。
import java.util.TreeSet;
import java.util.Set;
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
public int compareTo(Person per){
if(this.age>per.age){
return 1;
}
if(this.age<per.age){
return -1;
}
return 0;
}
}
public class TestJava{
public static void main(String args[]){
Set<Person> allSet=new TreeSet<Person>();
allSet.add(new Person("kasumi",28));
allSet.add(new Person("ayane",27));
allSet.add(new Person("moniji",29));
allSet.add(new Person("snowDrink",24));
System.out.println(allSet);
}
}
D:\>javac TestJava.java
D:\>java TestJava
[姓名:snowDrink,年龄:24, 姓名:ayane,年龄:27, 姓名:kasumi,年龄:28, 姓名:moniji,年龄:29]
现在我们将momiji的年龄修改的和kasumi的年龄一致,会发现momiji会被过滤掉了。
import java.util.TreeSet;
import java.util.Set;
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
public int compareTo(Person per){
if(this.age>per.age){
return 1;
}
if(this.age<per.age){
return -1;
}
return 0;
}
}
public class TestJava{
public static void main(String args[]){
Set<Person> allSet=new TreeSet<Person>();
allSet.add(new Person("kasumi",28));
allSet.add(new Person("ayane",27));
allSet.add(new Person("momoji",28));
allSet.add(new Person("snowDrink",24));
System.out.println(allSet);
}
}
D:\>javac TestJava.java
D:\>java TestJava
[姓名:snowDrink,年龄:24, 姓名:ayane,年龄:27, 姓名:kasumi,年龄:28]
所以TreeSet接口去重操作是依赖自数据类中的比较器,而我们这里自定义的比较器仅仅比较了年龄。
所以我们改良下比较器,让其遇到name属性即String时就调用String的比较器。
import java.util.TreeSet;
import java.util.Set;
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
public int compareTo(Person per){
if(this.age>per.age){
return 1;
}
if(this.age<per.age){
return -1;
}
return this.name.compareTo(per.name);
}
}
public class TestJava{
public static void main(String args[]){
Set<Person> allSet=new TreeSet<Person>();
allSet.add(new Person("kasumi",28));
allSet.add(new Person("ayane",27));
allSet.add(new Person("momoji",28));
allSet.add(new Person("snowDrink",24));
System.out.println(allSet);
}
}
D:\>javac TestJava.java
D:\>java TestJava
[姓名:snowDrink,年龄:24, 姓名:ayane,年龄:27, 姓名:kasumi,年龄:28, 姓名:momoji,年龄:28]
所以排序就完成了,并且momiji也没有被去除。
HashSet接口它是去重的但是对于自定义类型则就未必了
import java.util.Set;
import java.util.HashSet;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class TestJava{
public static void main(String args[]){
Set<Person> allSet=new HashSet<Person>();
allSet.add(new Person("kasumi",28));
allSet.add(new Person("ayane",27));
allSet.add(new Person("momoji",28));
allSet.add(new Person("momoji",28));
allSet.add(new Person("snowDrink",24));
System.out.println(allSet);
}
}
D:\>javac TestJava.java
D:\>java TestJava
[姓名:ayane,年龄:27, 姓名:kasumi,年龄:28, 姓名:momoji,年龄:28, 姓名:snowDrink,年龄:24, 姓名:momoji,年龄:28]
可以看到momiji出现两次且年龄都是28,但是却没有去重。
那么HashSet接口要想完成去重操作就类似于TreeSet接口完成排序操作一样,HashSet这里则是需要依赖于数据对象所在类的equals方法和hashCode方法,所以我们现在只需要对Person类中重写下这两个方法就可以完成Person的去重。
import java.util.Set;
import java.util.HashSet;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Person)){
return false;
}
Person p=(Person)obj;
if(this.name.equals(p.name) && this.age==p.age){
return true;
}
return false;
}
public int hashCode(){
return this.name.hashCode()*this.age;
}
}
public class TestJava{
public static void main(String args[]){
Set<Person> allSet=new HashSet<Person>();
allSet.add(new Person("kasumi",28));
allSet.add(new Person("ayane",27));
allSet.add(new Person("momoji",28));
allSet.add(new Person("momoji",28));
allSet.add(new Person("snowDrink",24));
System.out.println(allSet);
}
}
D:\>javac TestJava.java
D:\>java TestJava
[姓名:kasumi,年龄:28, 姓名:ayane,年龄:27, 姓名:snowDrink,年龄:24, 姓名:momoji,年龄:28]
关键字词:java,排序