I have a JTree in which the user can drag/drop or re-arrange nodes, upon saving I have to re-arrange the nodes such that File type nodes must appear before Folder type nodes. I don't need to sort the files/folders name.
User Tree:
-FolderA
+FFA1
-FA1
-FA2
-FolderB
-FB1
-File1
-File2
+FolderC
-File3
Resulting Tree:
-File1
-File2
-File3
-FolderA
-FA1
-FA2
+FAF1
-FolderB
-FB1
+FolderC
I have the following codes below, it worked but I don't know if it is the proper way or the good practice perhaps. Can you suggest which of the 2 solutions is better, or can you suggest other way.
Thanks you very much.
Solution 1:
private void arrange(DefaultMutableTreeNode parent){
DefaultMutableTreeNode sorted = new DefaultMutableTreeNode();
List<DefaultMutableTreeNode> files = new ArrayList<DefaultMutableTreeNode>();
List<DefaultMutableTreeNode> folders = new ArrayList<DefaultMutableTreeNode>();
for (int i = 0; i < parent.getChildCount(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode) parent.getChildAt(i);
int type = ((BusinessObject) node.getUserObject()).getType();
if (type == BusinessObject.FILE)
files.add(node);
else{
arrange(node);
folders.add(node);
}
}
for (int i = 0; i < files.size(); i++)
sorted.add((DefaultMutableTreeNode) files.get(i));
for (int i = 0; i < folders.size(); i++)
sorted.add((DefaultMutableTreeNode) folders.get(i));
while (sorted.getChildCount() > 0)
parent.add((DefaultMutableTreeNode) sorted.getChildAt(0));
sorted = null;
files = null;
folders = null;
}
Solution 2:
private void arrange(DefaultMutableTreeNode parent){
DefaultMutableTreeNode sorted = new DefaultMutableTreeNode();
List<DefaultMutableTreeNode> nodes = new ArrayList<DefaultMutableTreeNode>();
for (int i = 0; i < parent.getChildCount(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode) parent.getChildAt(i);
int type = ((BusinessObject) node.getUserObject()).getType();
if (type == BusinessObject.FILE)
nodes.add(node);
}
for (int i = 0; i < parent.getChildCount(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode) parent.getChildAt(i);
int type = ((BusinessObject) node.getUserObject()).getType();
if (type == BusinessObject.FOLDER){
arrange(node);
nodes.add(node);
}
}
for (int i = 0; i < nodes.size(); i++)
sorted.add((DefaultMutableTreeNode) nodes.get(i));
while (sorted.getChildCount() > 0)
parent.add((DefaultMutableTreeNode) sorted.getChildAt(0));
sorted = null;
nodes = null;
}
I think both are fine solutions. It was pretty easy to tell what they were doing: pull out the files, pull out the folders, throw them back in the tree in the right order. Also, the recursive call was straight-forward and intuitive.
Pick whichever seems the most natural to you. The second seems more like the way I would do it, but that's just me, and there's not much difference.
Are you using Java 5 or 6? If so, use for-each loops. Also, you don't have to clear that values of your private variables at the end of the method. They go away anyhow when the method returns.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With