java 对象查找_通过Java中的参数集查找最合适的对象
我的建议是使用比较器.请参阅下面的类的草图.
import java.util.HashMap;
import java.util.Map;
public abstract class Calculator {
public static Map weights;
static {
weights = new HashMap();
weights.put("price", 10);
weights.put("gender", 2);
weights.put("geo", 5);
}
public abstract int calculate(Map request);
public abstract int fitnessFor(Map request);
}
您可以使用权重来调整各个请求参数的相对重要性.
import java.util.Map;
public class Calculator1 extends Calculator {
public int calculate(Map request) {
return -1;
}
@Override
public int fitnessFor(Map 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 request) {
return -1;
}
@Override
public int fitnessFor(Map 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 {
private Map request;
public CalcComparator(Map 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 request = new HashMap();
request.put("price", 5);
request.put("gender", 1);
List calculators = new ArrayList();
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(""+c.toString() + "( fitness " + c.fitnessFor(request) + ")");
}
}
}
这只是一个草图来说明这个想法.您可能会想为请求参数引入一个枚举,可能会引入一个Request类,最有可能完全改变适应度的计算方式,将某些字段设为私有并封装它们,等等.
好处是,您可以根据它们对请求的适用性轻松获得所有计算器的订购.
java 对象查找_通过Java中的参数集查找最合适的对象相关推荐
- java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...
[多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...
- java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创
由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...
- java 字符串驻留_【Java中的字符串驻留】
最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...
- java classpath 目录_关于JAVA项目中CLASSPATH路径详解
在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候.classpath就是存放.class等编译后文件的路径. javac:如果当前你要编译的java文件中 ...
- java 的继承_关于java中的继承
我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...
- java final 类_在Java中,final修饰的类有什么特点
展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...
- java group类_浅析Java中线程组(ThreadGroup类)
Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...
- java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?
阅读本文大概需要 2 分钟. 来自: 码农网 为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨 ...
- java 防止拷贝_[改善Java代码]避免对象的浅拷贝
建议43: 避免对象的浅拷贝 我们知道一个类实现了Cloneable接口就表示它具备了被拷贝的能力,如果再覆写clone()方法就会完全具备拷贝能力.拷贝是在内存中进行的,所以在性能方面比直接通过ne ...
最新文章
- Paxos 实现日志复制同步(Multi-Paxos)
- C#3.0 为我们带来什么(2) —— 自动属性
- CF235C-Cyclical Quest【SAM】
- gentoo ffmpeg+mencoder快速搭建视频处理系统笔记
- CSDN审核机制有点迷惑,决定逐步搬迁到简书
- Linux创建内核线程kthread_create的用法介绍
- Linux nohup命令详解
- php b框架,thinkphp_bjui
- 国际科学数据服务平台nbsp;-nbsp;csdb
- 美赛O奖、F奖论文写作技巧!【微信公众号:校园数模】
- Electron实现桌面日历
- 在日本做开发的日子(序,生活篇的吃货,穿与住)
- 微信小程序前端合包流程weshop
- flea-db使用之JPA封装介绍
- Word文档标题设置,一级文字,二级及以下为数字
- vue 什么是渐进式 响应式 意思。Vue常用的指令。VUE:跨域设置。vue router 新窗口。$router.push。
- Hive基于SQL创建漏斗模型
- myeclipse修改jsp页面无反应
- 无法删除文件或文件夹的原因和解决方法(转)
- 数据压缩——WAV文件格式分析
热门文章
- java murmurhash实现_一致性哈希算法与Java实现
- python 虚线_Python 包安装和管理工具 pip 19.2 发布
- 如何安装html网站模板,网站模板安装说明
- 基于JAVA+SpringMVC+Mybatis+MYSQL的家庭理财管理系统
- 基于JAVA+SpringMVC+MYSQL的在线课程学习系统
- 帝国 listenews.php,帝国cms7.2后台信息列表页批量添加tags
- django系列5.2--ORM数据库的单表操作
- Linux基础命令---查找进程id
- 关于focus的概念
- 使用Free Spire.Presentation生成PowerPoint文件