给定下面的矩阵,用Java实现该矩阵的一种好方法是什么?
我想返回字符串消息,例如"Possibly OK"在该位置满足相应谓词时,例如pIndex = 4, volume = 1

java - 如何在Java中实现决策矩阵?-LMLPHP
我本质上具有5 * 5条件,因此有25个可能性。

这是我能想到的最好的方法(必须有一种更整洁,更易于维护的方法,如果if语句不是笨拙的):

@Test
void decisionMakerTest() {
    String decision = DecisionMaker.makeDecision(4.0, 1.0);
    Assertions.assertEquals("Possibly OK", decision);
}


class DecisionMaker {

    private DecisionMaker() {
        throw new IllegalStateException("Utility class");
    }

    private static List<Rule> ruleList = new ArrayList<>(Arrays.asList(
            new Rule(i -> (i <= 5), v -> (v <= -10), "Too Low"),
            new Rule(i -> (i <= 5), v -> (-10 < v && v <= -5), "Too Low"),
            new Rule(i -> (i <= 5), v -> (-5 < v && v < 2), "Possibly OK"),
            new Rule(i -> (i <= 5), v -> (2 <= v && v < 5), "Possibly OK"),
            new Rule(i -> (i <= 5), v -> (5 <= v), "Other - Investigate"),

            new Rule(i -> (5 < i && i <= 10), v -> (v <= -10), "Too Low"),
            new Rule(i -> (5 < i && i <= 10), v -> (-10 < v && v <= -5), "Possibly Too Low"),
            new Rule(i -> (5 < i && i <= 10), v -> (-5 < v && v < 2), "OK"),
            new Rule(i -> (5 < i && i <= 10), v -> (2 <= v && v < 5), "OK"),
            new Rule(i -> (5 < i && i <= 10), v -> (5 <= v), "Possibly Too High"),

            new Rule(i -> (10 < i && i < 90), v -> (v <= -10), "Possibly Too Low"),
            new Rule(i -> (10 < i && i < 90), v -> (-10 < v && v <= -5), "OK"),
            new Rule(i -> (10 < i && i < 90), v -> (-5 < v && v < 2), "OK"),
            new Rule(i -> (10 < i && i < 90), v -> (2 <= v && v < 5), "OK"),
            new Rule(i -> (10 < i && i < 90), v -> (5 <= v), "Possibly Too High"),

            new Rule(i -> (90 <= i && i < 95), v -> (v <= -10), "Possibly Too Low"),
            new Rule(i -> (90 <= i && i < 95), v -> (-10 < v && v <= -5), "OK"),
            new Rule(i -> (90 <= i && i < 95), v -> (-5 < v && v < 2), "OK"),
            new Rule(i -> (90 <= i && i < 95), v -> (2 <= v && v < 5), "Possibly Too High"),
            new Rule(i -> (90 <= i && i < 95), v -> (5 <= v), "Too High"),

            new Rule(i -> (95 <= i), v -> (v <= -10), "Other - Investigate"),
            new Rule(i -> (95 <= i), v -> (-10 < v && v <= -5), "Possibly OK"),
            new Rule(i -> (95 <= i), v -> (-5 < v && v < 2), "Possibly OK"),
            new Rule(i -> (95 <= i), v -> (2 <= v && v < 5), "Too High"),
            new Rule(i -> (95 <= i), v -> (5 <= v), "Too High")
    ));

    static String makeDecision(double pIndex, double volume) {
        for (Rule rule : ruleList) {
            if (rule.test(pIndex, volume)) {
                return rule.getDecision();
            }
        }

        return "Other - Investigate";
    }
}


class Rule {

    private DoublePredicate pIndexRule;
    private DoublePredicate volumeRule;
    private String decision;

    Rule(
            DoublePredicate pIndexRule, DoublePredicate volumeRule, String decision
    ) {
        this.pIndexRule = pIndexRule;
        this.volumeRule = volumeRule;
        this.decision = decision;
    }

    public boolean test(double pIndex, double volume) {
        return pIndexRule.test(pIndex) && volumeRule.test(volume);
    }

    String getDecision() {
        return decision;
    }

}

最佳答案

您可以尝试如下操作:

class DecisionMaker {
  static final List<DoublePredicate> P_INDEX_TEST = Arrays.asList(
        x -> x >  5.0,
        x -> x >  10.0,
        x -> x >= 90.0,
        x -> x >= 95.0
  );
  static final List<DoublePredicate> VOLUME_TEST = Arrays.asList(
        x -> x > -10.0,
        x -> x >  -5.0,
        x -> x >=  2.0,
        x -> x >=  5.0
  );
  static final String[][] TABLE = {
        {"Too Low",             "Too Low",          "Possibly OK", "Possibly OK",       "Other - Investigate"},
        {"Too Low",             "Possibly Too Low", "OK",          "OK",                "Possibly Too High"},
        {"Possibly Too Low",    "OK",               "OK",          "OK",                "Possibly Too High"},
        {"Possibly Too Low",    "OK",               "OK",          "Possibly Too High", "Too High"},
        {"Other - Investigate", "Possibly OK",      "Possibly OK", "Too High",          "Too High"},
  };

  static String makeDecision(double pIndex, double volume) {
    int row = (int) P_INDEX_TEST.stream().filter(p -> p.test(pIndex)).count();
    int col = (int) VOLUME_TEST .stream().filter(p -> p.test(volume)).count();
    return TABLE[row][col];
  }
}

关于java - 如何在Java中实现决策矩阵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58882439/

10-12 00:27
查看更多