如何在Hashmap中迭代直到所需的对象

时间:2012-01-24 14:52:35

标签: java gwt gwt2

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

有些人帮我解决这个问题会很有帮助。

2 个答案:

答案 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,只需从相应的文件夹集合中获取每个路径元素的值。