1

このオブジェクトがすべてです。

public class Unit {

private String label;
NumberRow numberRow;

Unit(String label){
    this.label=label;
    numberRow = new NumberRow();
}

....

}

これには、ラベル名と double の配列 (NumberRow()) が含まれます。UnitRow という名前の別のクラスは、これらの Unit の配列です。

public class UnitRow {

Unit[] unitArray;
private int elementsInArray;
Scanner in;


UnitRow(){
    unitArray = new Unit[Dataset.numberOfRecords];
    elementsInArray = 0;
}
......

}

しかし、もう 1 つのクラス、Leaf を紹介します。これにはユニットが含まれており、クラスター インターフェイスを実装しています。

public class Leaf implements Cluster {

private Unit unit;

Leaf(Unit unit){
    this.unit = unit;
}

    .......
public UnitRow getUnits() {
    UnitRow unitRow = new UnitRow();
    unitRow.addLabel(unit.getLabel());
    for (int x = 0; x < Dataset.numberOfVariables; x++){
        unitRow.addVar(unit.valueOnIndex(x));
    }
    return unitRow;
}

public boolean hasChildren() {
    return false;
}

}

これには Unit が含まれており、関数 UnitRow では、新しい UnitRow が 1 つの Unit だけで作成されます。つまり、クラスが作成されたときに作成されたときに与えられた Unit です。ノードと呼ばれる別のクラス (最後のクラス) もクラスター インターフェイスを実装します。

public class Node implements Cluster{

private Cluster leftChild;
private Cluster rightChild;

Node(Cluster leftChild, Cluster rightChild){
    this.leftChild = leftChild;
    this.rightChild = rightChild;
}

public UnitRow getUnits() {
    return leftChild.getUnits() + rightChild.getUnits();
}

}

ノードには左の子と右の子があります。このような子は、リーフまたは別のノードのいずれかになります。これで、ノードの下にあるすべてのリーフからのユニットの配列を提供する関数が Node にできました。私はJavaに伝えたいと思いました: return leftChild.getUnits() + rightChild.getUnits(); たとえば、leftChild と rightChild が両方ともリーフである場合、それらが返す配列はそのステートメントで一緒に追加されます。ただし、これは正しい方法ではありません。Node の関数 getUnits が最も効率的な方法で Units を含む 1 つの配列を返すようにする最も効率的な方法は何ですか?

4

1 に答える 1

1

2 つの配列を結合します。

public UnitRow getUnits() {
    Unit[] array1and2 = new int[leftChild.getUnits().length + rightChild.getUnits().length];
    System.arraycopy(leftChild.getUnits(), 0, array1and2, 0, leftChild.getUnits().length);
    System.arraycopy(rightChild.getUnits(), 0, array1and2, leftChild.getUnits().length, rightChild.getUnits().length);
    return new UnitRow(array1and2); //add this constructor
}

または、ループの方法:

public UnitRow getUnits() {
    Unit[] array1and2 = new int[leftChild.getUnits().length + rightChild.getUnits().length];

    for (int i=0; i<leftChild.getUnits().length; i++) {
        array1and2[i]= leftChild.getUnits()[i];
    }

    for (int i=0; i<rightChild.getUnits().length; i++) {
        array1and2[leftChild.getUnits().length + i]= rightChild.getUnits()[i];
    }

    return new UnitRow(array1and2); //add this constructor
}
于 2013-06-13T21:03:09.127 に答える