“红音列表实现引发的思考”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) |
||
第1行: | 第1行: | ||
− | + | === 需求 === | |
+ | 是: | ||
要为当前登录用户显示一个列表,这个列表里是过去72小时内所有登录过的用户; | 要为当前登录用户显示一个列表,这个列表里是过去72小时内所有登录过的用户; | ||
第26行: | 第27行: | ||
要求实现一套权重机制 | 要求实现一套权重机制 | ||
− | + | ||
+ | === 简单的实现 === | ||
+ | |||
+ | 是:<syntaxhighlight lang="java"> | ||
public class RankRecord { | public class RankRecord { | ||
第90行: | 第94行: | ||
float、double、BigDecimal、BigInteger?那么它们是怎么存的呢?每个字段存放进去又是怎么一个情况呢? | float、double、BigDecimal、BigInteger?那么它们是怎么存的呢?每个字段存放进去又是怎么一个情况呢? | ||
+ | === 浮点数的实现 === | ||
需要注意的是:不能应用位运算在浮点数上。 | 需要注意的是:不能应用位运算在浮点数上。 | ||
第152行: | 第157行: | ||
</syntaxhighlight>这样应该能放下很多权重因子了 | </syntaxhighlight>这样应该能放下很多权重因子了 | ||
+ | |||
+ | === 那么浮点数的极限在哪里? === |
2022年11月11日 (五) 09:29的版本
需求
是:
要为当前登录用户显示一个列表,这个列表里是过去72小时内所有登录过的用户;
这些用户要按一定的规则排序,规则是:
比如当前登录用户是女性,那么男性用户要排在女性用户前面(1、0);
同样是男性用户,有房的要排在没房的前面(1、0);
同样有房的,有车的要排在没车的前面(1、0);
受教育程度(博士、硕士、学士、高中)……(4、3、2、1);
婚姻状况(未婚、离异、丧偶)(3、2、1)
工作(央企、国企、公务员、……)(4、3、2、1)
年龄(28~35、35~40、23~28、……)(4、3、2、1);
身材((kg~kg)苗条、(kg~kg)匀称、(kg~kg)偏瘦、(kg~kg)偏胖、……)(4、3、2、1)
GPS定位计算出相对距离(km数、m数)
…… 要求实现一套权重机制
简单的实现
是:
public class RankRecord {
/**
* 性别
*/
private int gender;
/**
* 是否有房
*/
private int house;
/**
* 是否有车
*/
private int car;
/**
* 身高
*/
private int height;
/**
* 体重
*/
private int weight;
/**
* 权重
*/
private int weights;
public RankRecord(int gender, int house, int car, int height, int weight) {
this.gender = gender;
this.house = house;
this.car = car;
this.height = height;
this.weight = weight;
initWeights();
}
/**
* 初始化权重
* 整型应用位运算计算权重要把权重最大的属性放在前面,权重小的属性放在后面
*/
private void initWeights() {
int weights = gender;
weights = (weights << 1) + house;
weights = (weights << 1) + car;
weights = (weights << 1) + height;
weights = (weights << 1) + weights;
this.weights = weights;
}
}
但是 int 只有4个字节,最大值是 231,即便不考虑单个字段多值的情况(不止有0和1,还有像GPS定位计算出的相距公理、米数)作为权重因子,
应用左移扩大2倍很可能放不下所有的权重字段。
那么 weight 就声明成 long,可 long 最大也就是 263,还有比 long 能存储更大的值以便应用所有、甚至更多的权重因数吗?
float、double、BigDecimal、BigInteger?那么它们是怎么存的呢?每个字段存放进去又是怎么一个情况呢?
浮点数的实现
需要注意的是:不能应用位运算在浮点数上。
package rank;
public class RankRecord {
/**
* 性别
*/
private int gender;
/**
* 是否有房
*/
private int house;
/**
* 是否有车
*/
private int car;
/**
* 身高
*/
private int height;
/**
* 体重
*/
private int weight;
/**
* 权重
*/
private double weights;
public RankRecord(int gender, int house, int car, int height, int weight) {
this.gender = gender;
this.house = house;
this.car = car;
this.height = height;
this.weight = weight;
initWeights();
}
/**
* 初始化权重
*/
private void initWeights() {
double weights = Double.MIN_VALUE;
weights += gender;
weights = weights * 2 + house;
weights = weights * 2 + car;
weights = weights * 2 + height;
weights = weights * 2 + weights;
this.weights = weights;
}
}
这样应该能放下很多权重因子了