我的建议是使用比较器.请参阅下面的类的草图.

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中的参数集查找最合适的对象相关推荐

  1. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

  2. java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创

    由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...

  3. java 字符串驻留_【Java中的字符串驻留】

    最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...

  4. java classpath 目录_关于JAVA项目中CLASSPATH路径详解

    在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候.classpath就是存放.class等编译后文件的路径. javac:如果当前你要编译的java文件中 ...

  5. java 的继承_关于java中的继承

    我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...

  6. java final 类_在Java中,final修饰的类有什么特点

    展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...

  7. java group类_浅析Java中线程组(ThreadGroup类)

    Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...

  8. java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?

    阅读本文大概需要 2 分钟. 来自: 码农网 为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨 ...

  9. java 防止拷贝_[改善Java代码]避免对象的浅拷贝

    建议43: 避免对象的浅拷贝 我们知道一个类实现了Cloneable接口就表示它具备了被拷贝的能力,如果再覆写clone()方法就会完全具备拷贝能力.拷贝是在内存中进行的,所以在性能方面比直接通过ne ...

最新文章

  1. Paxos 实现日志复制同步(Multi-Paxos)
  2. C#3.0 为我们带来什么(2) —— 自动属性
  3. CF235C-Cyclical Quest【SAM】
  4. gentoo ffmpeg+mencoder快速搭建视频处理系统笔记
  5. CSDN审核机制有点迷惑,决定逐步搬迁到简书
  6. Linux创建内核线程kthread_create的用法介绍
  7. Linux nohup命令详解
  8. php b框架,thinkphp_bjui
  9. 国际科学数据服务平台nbsp;-nbsp;csdb
  10. 美赛O奖、F奖论文写作技巧!【微信公众号:校园数模】
  11. Electron实现桌面日历
  12. 在日本做开发的日子(序,生活篇的吃货,穿与住)
  13. 微信小程序前端合包流程weshop
  14. flea-db使用之JPA封装介绍
  15. Word文档标题设置,一级文字,二级及以下为数字
  16. vue 什么是渐进式 响应式 意思。Vue常用的指令。VUE:跨域设置。vue router 新窗口。$router.push。
  17. Hive基于SQL创建漏斗模型
  18. myeclipse修改jsp页面无反应
  19. 无法删除文件或文件夹的原因和解决方法(转)
  20. 数据压缩——WAV文件格式分析

热门文章

  1. java murmurhash实现_一致性哈希算法与Java实现
  2. python 虚线_Python 包安装和管理工具 pip 19.2 发布
  3. 如何安装html网站模板,网站模板安装说明
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的家庭理财管理系统
  5. 基于JAVA+SpringMVC+MYSQL的在线课程学习系统
  6. 帝国 listenews.php,帝国cms7.2后台信息列表页批量添加tags
  7. django系列5.2--ORM数据库的单表操作
  8. Linux基础命令---查找进程id
  9. 关于focus的概念
  10. 使用Free Spire.Presentation生成PowerPoint文件