HashSet排序【自定义一种排序方式:例如按照字符串的长短比较大小。如长度相同,就以数字比较】

//HashSet排序
//一般JAVA里定义好的类不会再去修改,以免造成下面继承的类有问题,因此,一般会自己定义一种排序
package fx;
import java.util.*;
//自定义排序方式案例①:按照字符串的长短比较大小。如长度相同,就以数字比较
class ComByLength implements Comparator //要想自定义一个排序方式,就要实现Comparator方法
{
public int compare(Object obj1,Object obj2)//固定的方法,要比较多少个,就写多少个参数
{
if(!(obj1 instanceof String))//判断是不是字符串,如不是抛出异常
{
throw new ClassCastException("obje1传递进来的类型转换异常");//抛出异常
}
if(!(obj2 instanceof String))//判断是不是字符串,如不是抛出异常
{
throw new ClassCastException("obje2 传递进来的类型转换异常");
}
String str1=(String) obj1;//强制转换成字符类型
String str2=(String) obj2;//强制转换成字符类型

//如果长度都是下相同的,就是造成排序不了。因此先放在变量,讲数字进行比较
int num= str1.length()-str2.length();
return num==0?str1.compareTo(str2):num;//如果长度相减等于0,就是长度相同了。数字比较,再取

}
}
public class TestHashSet {
public static void main(String[] args) {
ComByLength comByLength=new ComByLength();
TreeSet hs=new TreeSet(comByLength);//本身TreeSet已有排序方法,只是不是我们需要的方式,就可以在add面前确定方法
//在使用add方法添加对象时,就已经比较大小了。所以必须在使用add方法之前就确定比较方法
hs.add("java01wervger");
hs.add("java02abdabdbfbbfb");
hs.add("java09");
hs.add("java07");
System.out.println(hs); //输出结果:[java07, java09, java01wervger, java02abdabdbfbbfb]
}

}


//自定义排序方式案例②:按照 姓名来比较
package fx;
import java.util.*;
class StudentHSN implements Comparable
{
private String name;
private int age;
public StudentHSN(){}
public StudentHSN(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()//获取到当期的name,返回方便给其他地方调用
{
return this.name;
}
public int getAge()
{
return this.age;
}
//按照年龄排序方式
public int compareTo(Object obj)
{
if(!(obj instanceof StudentHSN))
{
throw new ClassCastException("类型转换异常");
}
StudentHSN stu=(StudentHSN) obj;
int num=this.age-stu.age;
return num==0?this.name.compareTo(stu.name):num;
}

public String toString() //toString ,T不能是大写。否则输出的不是字符串了
{
return name+","+age;
}
}
//自定义排序方法
class ComByName implements Comparator
{
public int compare(Object obj1,Object obj2)
{
if(!(obj1 instanceof StudentHSN))
{
throw new ClassCastException("obj1 传递进来的类型转换异常");
}
if(!(obj2 instanceof StudentHSN))
{
throw new ClassCastException("obj2传递进来的类型转换异常");
}
StudentHSN sHSN1=(StudentHSN)obj1;//强制上下类型转换
StudentHSN sHSN2=(StudentHSN)obj2;//强制上下类型转换

//2个名字对比,对比结果放到num变量里
int num=sHSN1.getName().compareTo(sHSN2.getName());

//num==0,是名字相同的,就按年龄相减,否则取原来的值
return num==0?sHSN1.getAge()-sHSN2.getAge():num;
}
}
public class TestHashSetName {
public static void main(String[] args) {
ComByName combn=new ComByName();//如果已经存在了定义的排序方式,会优先使用传递进来的排序方式
TreeSet ts=new TreeSet(combn);//因为TreeSet本身就有排序方式,因此在添加前就要定义。
ts.add(new StudentHSN("lisi",20));
ts.add(new StudentHSN("yoti",27));
ts.add(new StudentHSN("amm",30));
 
Iterator ite=ts.iterator();
while(ite.hasNext())
{
Object obj=ite.next();
System.out.println(obj);
}
}
}
//使用自定义排序的输出结果
/*amm,30
lisi,20
yoti,27*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值