通过Java中的参数集查找最合适的对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了通过Java中的参数集查找最合适的对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3298字,纯文字阅读大概需要5分钟。
内容图文
我有一组物体.该对象根据请求参数计算一些数字.我们称它们为计算器.每个计算器都有说明,该计算器最适合指定的请求类型.
例如,
Calculator1 : with this parameters : price > 10, gender = male, geo_id = 1, 2 or 3.
Calculator2 : with this parameters : price < 5, gender = male, geo_id = 1, 2.
对于请求:价格= 11,性别=男性,geo_id = 2我应该得到最合适的Calculator1,然后再选择Calculator2.
对于请求:价格= 4,性别=男性,geo_id = 2我应该先获得Calculator2,然后再获得Calculator1.
对于请求:价格= 3,性别=女性,geo_id = 5我应该只获得第二个.
现在,我正在使用Lucene进行此操作,但这并不完全适合此任务.你能推荐我一些图书馆或方法吗?
解决方法:
我的建议是使用比较器.请参阅下面的类的草图.
import java.util.HashMap;
import java.util.Map;
public abstract class Calculator {
public static Map<String, Integer> weights;
static {
weights = new HashMap<String, Integer>();
weights.put("price", 10);
weights.put("gender", 2);
weights.put("geo", 5);
}
public abstract int calculate(Map<String, Integer> request);
public abstract int fitnessFor(Map<String, Integer> request);
}
您可以使用权重来调整各个请求参数的相对重要性.
import java.util.Map;
public class Calculator1 extends Calculator {
public int calculate(Map<String, Integer> request) {
return -1;
}
@Override
public int fitnessFor(Map<String, Integer> request) {
int fitness = -1;
Integer price = request.get("price");
if (price == null)
return fitness;
if (price > 10)
fitness += weights.get("price");
return fitness;
}
public String toString() { return "Calculator1"; }
}
Calculator1只在乎昂贵的物品.
import java.util.Map;
public class Calculator2 extends Calculator {
public int calculate(Map<String, Integer> request) {
return -1;
}
@Override
public int fitnessFor(Map<String, Integer> request) {
int fitness = -1;
Integer price = request.get("price");
if (price == null)
return fitness;
if (price < 5)
fitness += weights.get("price");
Integer gender = request.get("gender");
if (gender == null)
return fitness;
if (gender == 1)
fitness += weights.get("gender");
return fitness;
}
public String toString() { return "Calculator2"; }
}
Calculator2在乎价格较低的物品,尤其是.如果他们是性别1.
比较器仅根据计算器相对于请求的适用性来比较计算器:
import java.util.Comparator;
import java.util.Map;
public class CalcComparator implements Comparator<Calculator> {
private Map<String, Integer> request;
public CalcComparator(Map<String, Integer> request) {
this.request = request;
}
@Override
public int compare(Calculator c1, Calculator c2) {
int c1Fitness = c1.fitnessFor(request);
int c2Fitness = c2.fitnessFor(request);
if (c1Fitness == c2Fitness)
return 0;
if (c1Fitness < c2Fitness)
return 1;
return -1;
}
}
试试看:
public class Main {
public static void main(String[] args) {
Map<String, Integer> request = new HashMap<String, Integer>();
request.put("price", 5);
request.put("gender", 1);
List<Calculator> calculators = new ArrayList<Calculator>();
calculators.add(new Calculator1());
calculators.add(new Calculator2());
Collections.sort(calculators, new CalcComparator(request));
System.out.println("For request: "+request);
for (Calculator c : calculators) {
System.out.println("\t"+c.toString() + "( fitness " + c.fitnessFor(request) + ")");
}
}
}
这只是一个草图来说明这个想法.您可能会想为请求参数引入一个枚举,可能会引入一个Request类,最有可能完全改变适应度的计算方式,将某些字段设为私有并封装它们,等等.
好处是,您可以根据它们对请求的适用性轻松获得所有计算器的订购.
内容总结
以上是互联网集市为您收集整理的通过Java中的参数集查找最合适的对象全部内容,希望文章能够帮你解决通过Java中的参数集查找最合适的对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。