我在GWT编程
我有类FolderColection和Folder, 在FolderColection类中有Hashmap hm
public class folderCollection{
public Map<String,Folder>FolderCollection = new HashMap<String,Folder>();
public void addFolder(Folder folder){
String folderKey = folder.getKey();
FolderCollection.put(folderKey, folder);
}
}
在文件夹类
中public Class Folder{
// Not a complete code , but an idea of a code
String name;
String dateOfcreation;
private FolderCollection folderCollection = new FolderCollection();
// Folder can also have many sub folders
//More variables
// all get set methods
}
现在举例来说:所有都是文件夹
1.A
1.Aa
1.Aa1
2.Aa2
2.Ab
2.B
1.Ba
2.Bb
3.C
A,B,C文件夹位于FolderCollection中。 由于A也是一个文件夹,它包含FolderCollection(Folder Aa,Folder Ab)。 类似地,文件夹Aa具有FolderCollection(文件夹Aa1,文件夹Aa2)。
我能够做到这一点,我已在上面解释过。
我难以访问对象,例如文件夹Aa1的对象。 假设我想要更改文件夹Aa2的名称,因为我必须迭代到该对象。
请帮我解决这个问题。
我有路径,因为所有文件夹名称都添加到parentTreeItem的树小部件中。
例如:如果我必须更改Aa2的名称 我有
String [] path ={A,Aa,Aa2};
有些人帮我解决这个问题会很有帮助。
答案 0 :(得分:1)
我希望你的Folder类上必须有一个getFolder
(?),你提供文件夹名称,它会返回带有该名称的子文件夹。您可以使用您的路径在循环中遍历此“cd”到您感兴趣的级别。然后,我想getFile
将返回File
个对象。然后,您可以rename
您的文件(虽然您的路径必须更新以反映任何文件夹名称更改)。
Folder rootFolder = ...;
String[] path = ...;
Folder f = null;
for (int i=0; i<path.length; i++) {
folder = rootFolder.getFolder(path[i]);
}
// f now contains the folder at "path"
// N.B. Haven't handled FolderNotFoundException
File file = f.getFile("Aa2.txt");
file.setName("Aa2.new.txt");
/* Folder#getFolder returning sub-folder for name passed */
public Folder getFolder(String name) {
Folder f = folderCollection.get(name); //no null checks done!
if (f == null) {
... //FolderNotFoundException?
}
return f;
}
或者,您可以向Folder#getFolderInPath
提供路径(或路径的封装表示),并在内部处理Folder
。此版本是迭代的,循环遍历路径数组,在每次迭代时使用文件夹路径中的该级别更新f。它使用上面的getFolder
:
Folder rootFolder = ...;
String[] path = ...;
Folder f = rootFolder.getFolderInPath(path);
File file = f.getFile("Aa2.txt");
/* Folder#getFolder returning sub-folder for name passed
* This is an "iterative" implementation - looping path array
*/
public Folder getFolderInPath(String[] path) {
Folder f = null;
for (int i=0; i<path.length; i++) {
folder = this.getFolder(path[i]);
}
// f now contains the folder at "path"
// N.B. Haven't handled FolderNotFoundException
return f;
}
这是上述的递归版本,并再次使用getFolder
(大于x 2)。需要一些解释 - #getFolderInPath
现在只委托递归方法#getFolderRecursive
,传递递归的根值(起始文件夹[“this”]和路径中的起点 - 索引)。
方法#getFolderRecursive(Folder
递归调用自身,直到遍历路径(索引&lt; path.length)。成功遍历时(FolderNotfoundException?)然后index = path.length。在每个级别,我们使用找到的文件夹进行递归调用,该文件夹与路径中该级别的名称匹配(由索引控制)。在底层,找到#getFolder
的文件夹是路径中的最后一个,应该返回。然后解析递归方法,在var folderArtPath
中向上传递f(为清楚起见)。 else
条件在遍历路径时设置此变量,并在if块中的行folderAtPath =
中执行堆栈:
Folder rootFolder = ...;
String[] path = ...;
Folder f = rootFolder.getFolderInPath(path);
File file = f.getFile("Aa2.txt");
/* Folder#getFolder returning sub-folder for name passed
* This is an "recursive" implementation - digging into the Folder structure
*/
public Folder getFolderInPath(String[] path) {
//Begin recursion with "this2 folder"
return getFolderRecursive(this, path, 0);
}
/* Internal recursive method
*/
private Folder getFolderRecursive(Folder baseFolder, String[] path, int index) {
Folder folderAtPath = null; //This is going to carry the Folder at "path"
if (index < path.length) { //Recursive base condition (are we done?)
//Get folder f with name according to path and index
Folder f = baseFolder.getFolder(path[index])); //FolderNotFoundException?
//Recursively call found folder f with path and index referring
//to next path-part to be used (index+1)
folderAtPath = getFolderRecursive(f, path, index+1);
}
else {
folderAtPath = baseFolder;
}
return folderAtPath;
}
可能有更好的方法可以做到这一点,但我现在无法检查它。花了太多时间,但不得不纠正我的迷你烹饪。递归有点乐趣......在线找一个简单的例子,然后玩它。
你也可能想让文件夹和文件有一些共同的界面。
答案 1 :(得分:0)
如果你有路径,你不必遍历hashmap,只需从相应的文件夹集合中获取每个路径元素的值。