如何实现一种用于在Java中选择合适图像的启发式算法

时间:2010-10-15 15:52:10

标签: java heuristics

对于显示产品信息的页面,我们必须从显示相同内容但具有不同格式(gif,png,jpg等),不同质量(jpeg comrpession)的一组图像中选择最佳产品图像),不同尺寸(缩略图,小,中,大)等。

选择取决于用户的浏览器,当前页面大小,图像用途等。

我们当前的解决方案是根据当前的需求构建一个SQL查询:

SELECT img.id 
FROM img 
WHERE img.format IN ('GIF','JPG') 
AND img.width <= 1000
ORDER BY img.quality DESC

这是一个简单的例子,原件要复杂得多。创建此语句的java代码使用了大量的ifs和case,并且开始变得非常难看。

在Java中实现这种启发式的最佳方法是什么?有没有可以提供帮助的图书馆?也许沿着定义规则对象的路线:

Engine engine = new Engine();
engine.addRule(new IncludeRule("format", {"GIF", "JPG"}));//only gif and jpg
engine.addRule(new MaxRule("width", 1000));//max width
engine.addRule(new WeightedRule("quality", DESC));//go for high quality
Image result = engine.getResult();

我搜索了规则引擎,甚至还有一个JSR和一些开源规则引擎,但它们似乎都在处理Buissness规则。

我有强烈的感觉,我们正在重新发明轮子,我们根本无法找到任何解决方案,因为我们不知道这些东西的正确名称; - )

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

如果您只是构建SQL查询,则可以自己构建引擎:

public interface Rule{
    String getSQLWhereClause();
    String getSQLOrderClause();
}

public class Engine
{
    String buildSQLFromRules(Collection<Rule> rules) {
        String s = "SELECT IMG.ID FROM IMG";
        String w = "";
        String o = "";

        for(Rule r : rules)
        {
             if (r.getSQLWhereClause() != null) {
                 if (!w.isEmpty()) { w = w + " AND " }

                  w += r.getSQLWhereClause()
             }
             ... same for order
         }

         return s + (w.isEmpty()? "" : " WHERE " + w) + (o.isEmpty()?"": " ORDER BY " + o);
      }
 }

然后您可以将接口定义为:

 public class MaxRule implements Rule
 {
       String fld;
       String max;

       public MaxRule() { ... }

       String getSQLWhereClause() { return "img." + fld + " <= " + max; }
       String getSQLOrderClause() { return null; }
 }