根据某个值匹配多条记录中的某个级别,使用比较器Comparable和TreeSet技术

本文介绍了一种使用TreeSet和自定义实体类实现的收入级别匹配算法。通过将收入与预设级别进行比较,快速定位并返回对应的收入等级,适用于如会员级别、学生成绩评定等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际工作中,我们可能会遇到根据给定值去匹配多条记录中的某一条记录,给一个值定性的问题。

比如:某个学生考试得分61,配置信息中有三条记录,60分以下不及格,60~80及格,80~100优秀,各级别对应相应评语、奖励等PO属性,我们要根据61分在多条记录中去匹配一条记录。

再比如:会员级别的需求,会员配置表中,积分1000,白金会员,积分800,黄金会员,积分500,青铜会员,积分200,普通会员,如果一个用户积分520,那么该用户的会员级别是什么呢?

这里笔者写一个小Demo以点带面解决该类问题。

需求,根据给定的具体收入匹配该收入的级别。

收入对应关系如下:

20000,"高收入"            3000,"贫穷"              8000,"低收入"            18000,"一般收入"                13000,"普通收入"       30000,"富裕"

效果如下:收入级别列表模拟级别配置信息,5500模拟给定的值

代码如下:

import java.lang.Comparable;
import java.util.TreeSet;
import java.math.BigDecimal;
class TreeSetDemo 
{
	public static void main(String[] args) 
	{
		TreeSet<IncomeLevel> set=new TreeSet<IncomeLevel>();
		set.add(new IncomeLevel(20000,"高收入"));
		set.add(new IncomeLevel(3000,"贫穷"));
		set.add(new IncomeLevel(8000,"低收入"));
		set.add(new IncomeLevel(18000,"一般收入"));
		set.add(new IncomeLevel(13000,"普通收入"));
		set.add(new IncomeLevel(30000,"富裕"));
		System.out.println("收入级别列表(已排序)");
		for(IncomeLevel incomeLevel:set){
			System.out.println(incomeLevel);
		}
		System.out.println();
		BigDecimal income=new BigDecimal(5500);
		IncomeLevel incomeLevel=getIncomeLevel(set,income);
		System.out.println("你的收入"+income+"对应级别是:"+incomeLevel.getLevel());

	}
	
	private static IncomeLevel getIncomeLevel(TreeSet<IncomeLevel> set,BigDecimal income){
		int ic=income.intValue();
		if(ic<=set.first().getIncome()){
			return set.first();
		}else if(ic>set.last().getIncome()){
			return set.last();
		}else{
			return set.floor(new IncomeLevel(ic,""));
		}
	}
	
}


class IncomeLevel implements Comparable<IncomeLevel>
{
	private Integer income;
	private String level;

	public IncomeLevel(Integer income,String level){
		this.income=income;
		this.level=level;
	}

	public Integer getIncome(){
		return this.income;
	}

	public String getLevel(){
		return this.level;
	}
	
	@Override
	public int compareTo(IncomeLevel o){
		int i=this.income-o.income;
		return i==0?1:i;
	}

	@Override
	public String toString(){
		return this.level+":"+this.income;
	}

}

技术要点:

1,自定义的实体类一定要实现Comparable接口,重写compareTo方法,按你的需求排序,没有比较器,无法添加实体类到TreeSet中。

2,使用TreeSet中的方法得到相应的实体类,first()、last()、floor()等视需求而定。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值