Tôi đã viết một cây ADT n-ary hoạt động tốt. Tuy nhiên, tôi cần phải lưu trữ serialization của nó trong một biến một lớp gọi điện thoại. ví dụ.Nối chuỗi chậm trên đầu vào lớn
DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
String x = a.toString();
Tôi đã viết phương pháp phục vụ mục đích chính xác làm thế nào tôi cần đến nó, nhưng đầu vào rất lớn nó sẽ mãi mãi (20 phút trên một tập tin 100MB xml) - Tôi đã timed các phương pháp và xây dựng cây từ Tệp xml là nhanh, nhưng gọi toString() như được hiển thị ở trên là rất chậm.
@Override
public String toString(){
return printTree(this);
}
public String printTree(AbstractTree<E> tree){
if (tree.isLeaf()){
return tree.getNodeName();
}else{
String tStr = tree.getNodeName() + "(";
int i = 0;
Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size() - 1){
tStr += printTree(child.next()) + ", ";
i++;
}
tStr += printTree(child.next()) + ")";
return tStr;
}
}
Tôi đoán nó là để làm với cách chuỗi được xây dựng chứ không phải như thế nào cây được đi qua? Có cách nào tốt hơn để làm điều này?
CẬP NHẬT: Theo ví dụ về Skaffman, mã sau cung cấp cho outOfMemoryError cho đầu vào rất lớn.
@Override
public String toString(){
StringBuilder buffer = new StringBuilder();
printTree(this, buffer);
return buffer.toString();
}
public String printTree(AbstractTree<E> tree, StringBuilder buffer){
if (tree.isLeaf()){
return tree.getNodeName();
}else{
buffer.append(tree.getNodeName());
buffer.append("(");
int i = 0;
Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size() - 1){
buffer.append(printTree(child.next(), buffer));
buffer.append(", ");
i++;
}
buffer.append(printTree(child.next(), buffer));
buffer.append(")");
return buffer.toString();
}
}
UPDATE: Tác phẩm hoàn hảo bây giờ, sử dụng Skaffmans dụ
Đừng đoán. Có được cho mình một profiler và đo lường nó. – skaffman
OK, bạn đang trộn và kết hợp các phương pháp cũ và mới ngay bây giờ. Tôi đã cập nhật câu trả lời của mình để cho bạn thấy ý tôi là đầy đủ. – skaffman