实现DecisionTree专题一:对6000多个属性的迷惑与解铃

起步做决策树分类器的作业,第一步当然是读取文件,取得所有行的数据;但是自己就在这停住了,总想

着应该设计一个Sample类,这个类有6000多个属性,那么岂不是要定义6000多个变量?百思不得其解呀。

后来问杨惠,杨惠说,定义一个数组就可以了,每次只需要找出熵最大的那个属性就可以。恍然大悟的感

觉!

自己可能之前一直在看UML的书,UML书上说一般先分析系统将会有哪些类,然后分析这些类的属性和方法

等,同时要遵守单一职责原则(SRP)、开放-封闭原则(OCP)等;所以,自己现在很自然的想到要去分

析实现这个决策树将会有什么类,然后Sample类就这样冒出来了。

其实,UML只适合用于分析工程项目,并不适合用于分析算法类的程序,这个Bob大叔的《uml for java

pro》书上也提到了。

首先分析要解决什么事情,需要每一步做什么,再去考虑怎么写代码才是正确的。例如,构建

decisiontree的第一步是求各个属性的熵(第二步是取熵的最大值),那么就想如何去求各个属性的熵就

ok!而不是看着数据空想构造什么Sample类。因为decisiontree是以属性为基础的,无需构造样本类。

原以为到此,自己已经弄明白了;学习和总结了数组与ArrayList的内容之后,才突然发现,原来自己的

迷惑源于数组与ArrayList的迷惑!自己的语言功底太差了!就算是要定义一个样本类Sample类,这个类

有6000多个属性,也只需要定义一个属性数组Attributes[]或者一个ArrayList attributes就ok了!这正

是数组的作用!!看了良葛格的《java jdk5 学习笔记》的“数组”那章才忽然明白过来了!


补充内容:
1.为什么需要数组?
(《java jdk5.0 学习笔记》良葛格 http://book.csdn.net/bookfiles/135/1001354617.shtml)
例如,现在要整理全班的Java小考成绩,您希望写个小程序,全班共有40名学生,所以必须有40个变量来

存储学生的成绩。现在问题来了,根据第3章学过的变量定义方式,难道要定义40个名称不同的变量来存

储学生的成绩数据吗?

当然不必这么麻烦,Java提供“数组”(Array)让您可以定义一个以“索引”(Index)作为识别的数据结构

。在Java中,可以这么定义一个数组并初始数组内容:

int[] score = {90, 85, 55, 94, 77};


2.ArrayList可以置入任意数据类型,包括数组;例如,可以置入String[]类型的对象。因为ArrayList本

身就是数组,在ArrayList中置入数组,也就相当于一个二维数组。

在java中,数组也是对象,二维数组的实际是连续存放一维数组对象的各个reference。



受启发的资料:
ArrayList<String[]>如何导出为String[][]?
http://www.mysdn.cn/Java/J2SEjichulei/20060914/9172.html

《java jdk5.0 学习笔记》良葛格 第五章 数组
 http://book.csdn.net/bookfiles/135/1001354617.shtml