在实际工作中,我们可能会遇到根据给定值去匹配多条记录中的某一条记录,给一个值定性的问题。
比如:某个学生考试得分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()等视需求而定。