Java 递归函数中树的生成

Java 递归函数中树的生成,java,python,algorithm,recursion,Java,Python,Algorithm,Recursion,我正在尝试用java实现C4.5算法。为了对C4.5算法有一个初步的了解,我从这里引用了一段python代码。在这个项目中,有一个名为mine.py的文件,其中包含以下函数 def mine_c45(table, result): """ An entry point for C45 algorithm. _table_ - a dict representing data table in the following format: {

我正在尝试用java实现C4.5算法。为了对C4.5算法有一个初步的了解,我从这里引用了一段python代码。在这个项目中,有一个名为mine.py的文件,其中包含以下函数

def mine_c45(table, result):
    """ An entry point for C45 algorithm.
        _table_ - a dict representing data table in the following format:
        {
            '<column name>': [<column values>],
            '<column name>': [<column values>],
            ...
        }
        _result_: a string representing a name of column indicating a result.
    """
    col = max([(k, gain(table, k, result)) for k in table.keys() if k != result],
              key=lambda x: x[1])[0]
    tree = []
    for subt in get_subtables(table, col):
        v = subt[col][0]
        if is_mono(subt[result]):
            tree.append(['%s=%s' % (col, v),
                         '%s=%s' % (result, subt[result][0])])
        else:
            del subt[col]
            tree.append(['%s=%s' % (col, v)] + mine_c45(subt, result))
    return tree
def mine_c45(表,结果):
“”“C45算法的入口点。
_table_u3;-以以下格式表示数据表的dict:
{
'': [],
'': [],
...
}
_结果:表示指示结果的列名称的字符串。
"""
col=table.keys()中k的最大值([(k,增益(表,k,结果)),如果k!=result],
key=lambda x:x[1])[0]
树=[]
对于get_子表(表,列)中的子表:
v=子[col][0]
如果是单(子[结果]):
追加(['%s=%s'(列,v),
“%s=%s%”(结果,子[result][0]))
其他:
del subt[col]
tree.append(['%s=%s'(col,v)]+mine_c45(subt,result))
回归树
通过使用link中的代码,我尝试在Java中转换此代码,并对其进行一些修改。我成功地得到了我想要的输出,但问题是我不能以递归的方式构建树

这里是用java转换的代码

public void mineC45(Map<String, Attribute> table, String result) {
    int maxGain = 0;
    double[] gains = new double[table.size()];
    int counter = 0;
    SplitPoints point = null;
    for (Entry<String, Attribute> entry : table.entrySet()) {
        if (!entry.getKey().equals(result)) {
            boolean nominal = entry.getValue().isNominal();
            if (nominal)
                gains[counter++] = Utils
                        .gain(table, entry.getKey(), result);
            else {
                point = Utils.numericGain(table, entry.getKey(), result);
                gains[counter++] = point.getGain();
            }
        }
    }

    // calculate maximum gain column index
    maxGain = Utils.getMax(gains);
    List<String> keys = new ArrayList<String>(table.keySet());
    String column = keys.get(maxGain);
    if (table.get(column).isNominal()) {
        for (Map<String, Attribute> subTable : Utils.createSubTables(table,
                column)) {
            String value = subTable.get(column).getValues().get(0);
            if (Utils.isMono(subTable.get(result))) {
                System.out.println("\t" + column + " = " + value + " "
                        + result + " = "
                        + subTable.get(result).getValues().get(0));
            } else {
                subTable.remove(column);
                System.out.println(column + " = " + value + " ");
                mineC45(subTable, result);
            }
        }
    } else {
        boolean first = true;
        for (Map<String, Attribute> subTable : Utils.createNSubtables(
                table, column, result, point.getSplitValue())) {
            String sign = "";
            sign = first ? "<=" : ">";
            first = false;
            if (Utils.isMono(subTable.get(result))) {
                System.out.println("\t" + column + " "
                        + point.getSplitValue().toString() + " " + result
                        + " = " + subTable.get(result).getValues().get(0));
            } else {
                subTable.remove(column);
                System.out.println(column + " "
                        + point.getSplitValue().toString() + " ");
                mineC45(subTable, result);
            }
        }
    }
}
public void mineC45(映射表、字符串结果){
int maxGain=0;
double[]增益=新的double[table.size()];
int计数器=0;
SplitPoints=null;
for(条目:table.entrySet()){
如果(!entry.getKey().equals(result)){
boolean nominal=entry.getValue().isNominal();
如果(标称)
增益[计数器++]=Utils
.gain(表,entry.getKey(),结果);
否则{
point=Utils.numericGain(表,entry.getKey(),结果);
增益[计数器++]=point.getGain();
}
}
}
//计算最大增益列索引
maxGain=Utils.getMax(增益);
列表键=新的ArrayList(table.keySet());
字符串列=keys.get(maxGain);
if(table.get(column.isNominal()){
for(映射子表:Utils.createSubTables(表,
(列){
字符串值=子表.get(列).getValues().get(0);
if(Utils.isMono(subTable.get(result))){
System.out.println(“\t”+列+”=“+值+”)
+结果+“=”
+subTable.get(result.getValues().get(0));
}否则{
子表。删除(列);
System.out.println(列+“=”+值+”);
mineC45(子表、结果);
}
}
}否则{
布尔值优先=真;
对于(映射子表:Utils.createNSubtables)(
表、列、结果、点。getSplitValue()){
字符串符号=”;
符号=第一个?“;
第一个=假;
if(Utils.isMono(subTable.get(result))){
System.out.println(“\t”+列+”)
+point.getSplitValue().toString()+“”+结果
+“=”+子表.get(结果).getValues().get(0));
}否则{
子表。删除(列);
System.out.println(列+“”
+point.getSplitValue().toString()+“”);
mineC45(子表、结果);
}
}
}
}

在这里,我创建了表示一个表的
Map
。字符串键表示列名,属性存储值列表。如果有人能向我解释,我将如何将输出转换为树,以便形成规则。

Python树的结构是什么?你把它打印出来检查了吗?这不会出现在您的帖子中。Java中相应的数据结构是什么?人们通常如何在Java中实现一个树(您想要的任何类型)?通过查看代码,python中的结构非常容易理解。开发人员只是在其中附加了嵌套数组。这在python中是可能的,但在java中是不可能的,所以我想将每个节点添加到树中,就像JTree有DefaultMutableTreeNode一样,我可以创建它们,这不是一个问题,但我关心的是,我希望它以正确的方式进行,例如,检查这张图片,你就会知道。我知道这是一个简单的结构;我试图帮助您完善您的问题,以便有人能够快速回答(我已经有3年没有编写Java了)。请将这些澄清编辑到问题的主体部分。另外,请更仔细地描述你被困的地方。您似乎知道要使用的结构的名称,以及它们如何组合在一起。只要听起来像是在要求我们为您设计或编写代码,很多人就会忽略这个问题——StackOverflow并不能完成大部分工作。