【问题标题】:How Do I Model My Results Using Java Collections?如何使用 Java 集合对结果建模?
【发布时间】:2014-03-07 15:37:27
【问题描述】:

我有一个应用程序正在使用 Drools Expert 来评估一些规则。结果将是这种类型:

String, String, Integer

一个典型的结果示例是:

"Rule 1", "RED",   1
"Rule 2", "AMBER", 2
"Rule 3", "GREEN", 1
"Rule 4", "INFO",  3

第一个元素是键。所以我正在考虑使用 Map 结构。最后一个字段是通过枚举指定的整数。我希望能够从这个结果列表中选择具有最高优先级(即最后一个字段)的规则。

就使用 Java 集合库而言,构建它的最佳方式是什么?地图是最好的吗?

【问题讨论】:

  • 您创建一个包含三个值的“bean”,然后将其放入Collection。集合的选择取决于您计划如何使用数据以及您希望在唯一性中施加什么规则。最常见的是List、“Map”或“Set”,每个都有特定的实现,提供不同的功能数组。

标签: java


【解决方案1】:

我希望能够从该结果列表中选择具有最高优先级(即最后一个字段)的规则。

您可以将数据打包成一个基于最后一个字段可比较的类,然后使用PriorityQueue

class Data implements Comparable<Data> {
    private String rule;
    private String other;
    private int priority;

    ...

    @Override
    public int compareTo(Data other) {
        return Integer.compare(priority, other.priority);
    }
}

现在,您可以使用PriorityQueue&lt;Data&gt;

【讨论】:

  • 我是否像这样初始化它:PriorityQueue q = new PriorityQueue(10); ?
【解决方案2】:
Queue<Result> resultList = new PriorityQueue<Result>();

public class Result implements Comparable<Result>{

    private String ruleText;
    private String text; // 2. value
    private int priority;

    @Override
    public int compareTo(Result result) {
        return new Integer(priority).compareTo(result.getPriority());
    }

    public String getRuleText() {
        return ruleText;
    }

    public void setRuleText(String ruleText) {
        this.ruleText = ruleText;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }
}

【讨论】:

    【解决方案3】:

    是的,如果您在数据收集中有一些被称为关键的东西,那么地图是最好的存储方式。对于优先级,最好使用 PriorityQueue。

    【讨论】:

      【解决方案4】:

      最好的方法是创建一个实现可比较的对象。

      class Rule implements Comparable<Rule>{
          String firstPart;
          String secondPart;
          int priority;
          //constructor
          //getters and setters
      
          @Override
          public int compareTo(Rule other){
               return Integer.compare(this.priority, other.priority);
          }
      }
      

      然后您只需将它们全部放在TreeSet&lt;Rule&gt; 中并对其进行迭代,它们就会排序出来。或者您可以将它们存储在列表中并致电Collections.sort(list)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 2011-09-10
        相关资源
        最近更新 更多