2013-06-13 2 views
1

Этот объект является то, что это все о:Наиболее эффективный способ объединения двух массивов объектов

public class Unit { 

private String label; 
NumberRow numberRow; 

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

.... 

} 

Он содержит имя метки и массив удваивается (то будет NumberRow()) Другой класс с именем UnitRow является массив из этих единиц:

public class UnitRow { 

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


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

} 

Однако я собираюсь ввести еще один класс: Лист. Он содержит блок и реализует интерфейс кластера:

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; 
} 

} 

Он содержит блок и в функции UnitRow новый UnitRow создается только с одной единицы; а именно 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(); 
} 

} 

Узел имеет левый ребенка и правый ребенка. Такой ребенок может быть либо листом, либо другим узлом. Теперь у меня есть функция в узле, дающая мне массив единиц из всех листьев под собой. Я бы сказал, что java: return leftChild.getUnits() + rightChild.getUnits(); так, например, если leftChild и rightChild являются обоими листами, те массивы, которые они возвратят, добавляются вместе в этот оператор. Однако это неправильный путь. Каков наиболее эффективный способ позволить функции getUnits в Node возвращать один массив с единицами наиболее эффективным способом?

+0

Рассмотрите возможность использования 'List's вместо (например,' ArrayList'). С помощью 'List' вы можете вызвать' addAll'. –

+0

Я бы хотел, но университет не позволит мне это сделать ... – tortilla

ответ

1

Объединение двух массивов:

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 
} 
+0

Да, это, безусловно, хорошее решение, но вы создаете новый массив для каждого проходящего его узла. Это необходимо? – tortilla

+0

Да, это необходимо. – darijan

+0

Oke, большое спасибо! – tortilla

Смежные вопросы