hashmap—在java中实现静态类表结构的最佳方法

tvokkenx  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(494)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

23天前关门了。
改进这个问题
我需要创建一个简单的表,可能有13个输入列和1个输出列。此表中的数据不会更改。

类似于我们在这个图表/图片中看到的。我在努力寻找最好的方法。
使用.dmn表(决策表)
pros-决策表是一个静态表,可以帮助轻松实现此逻辑。
缺点-在我的osgi微服务中,我从未使用过jbpmn或camunda或任何类似的bpmn库。因此,仅仅为了创建决策表而导入、学习和使用库是一项开销。你同意吗?
在java本身中创建一个数据结构来保存这个静态表。然而,最大的问题是如何在java中创建这样的数据结构?
一种方法是使用一个Map,其中key作为所有输入列的串联,value作为输出列。但是,该键将变为超长至少13个字符(如果我决定使用yn或其他字符来表示表中的true、false、n/a值)。
还有别的办法吗?

ttp71kqs

ttp71kqs1#

首先,我喜欢你的Map创意。它应该易于实现、理解和维护。
另一个想法是使用13维数组:

String[][][][][][][][][][][][][]

可能是14维,我还没想清楚?
e、 g.对于2个输入列:

String[][] table = new String[3][3];

table[0][0] = "a";
table[0][1] = "b";
table[0][2] = "c";

table[1][0] = "d";
table[1][1] = "e";
table[1][2] = "f";

table[2][0] = "g";
table[2][1] = "h";
table[2][2] = "i";

对应map方法:

map.put("--", "a");
map.put("-N", "b");
map.put("-Y", "c");

map.put("N-", "d");
map.put("NN", "e");
map.put("NY", "f");

map.put("Y-", "g");
map.put("YN", "h");
map.put("YY", "i");
slhcrj9b

slhcrj9b2#

既然我们使用的是java,首先想到的就是创建一个类。
所以,让我们创建一个类来保存决策表的一行。

public class DecisionRow {

    private final Boolean[] input;
    private final String output;

    public DecisionRow(Boolean[] input, String output) {
        this.input = input;
        this.output = output;
    }

    public boolean doesInputMatch(Boolean[] input) {
        for (int i = 0; i < input.length; i++) {
            if (this.input[i] != null && !this.input[i].equals(input[i])) {
                return false;
            }
        }
        return true;
    }

    public String getOutput() {
        return output;
    }

}

接下来,我们将创建一个类来保存决策树;

public class DecisionTree {

    private List<DecisionRow> decisionTree;

    public DecisionTree() {
        this.decisionTree = createDecisionTree();
    }

    private List<DecisionRow> createDecisionTree() {
        List<DecisionRow> decisionTree = new ArrayList<>();

        Boolean[] values = new Boolean[] { true, false, false, false, false,
                false, false, false, false, true, null, null, false };
        decisionTree.add(new DecisionRow(values, "vanguard"));

        values = new Boolean[] { true, false, false, false, false,
                null, false, false, false, false, false, false, false };
        decisionTree.add(new DecisionRow(values, "jpmc"));

        return decisionTree;
    }

    public List<DecisionRow> getDecisionTree() {
        return decisionTree;
    }

    public DecisionRow getDecisionRow(Boolean[] values) {
        for (DecisionRow decisionRow : decisionTree) {
            if (decisionRow.doesInputMatch(values)) {
                return decisionRow;
            }
        }

        return null;
    }

}

您可以根据需要向决策树中添加任意多的行。你方不适用由 null .
现在,你要做的就是匹配布尔值得到输出 String .

相关问题