Как перебирать в Hashmap до нужного объекта - PullRequest
3 голосов
/ 24 января 2012

Я занимаюсь программированием в 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 (Папка Aa, Папка Ab). Аналогичным образом папка Aa имеет коллекцию папок (папка Aa1, папка Aa2).

Я смог сделать то, что объяснил выше.

Мне сложно получить доступ к объекту, например, к объекту из папки Aa1. Предположим, я хочу изменить имя папки Aa2, для этого мне нужно выполнить итерацию до этого объекта.

Пожалуйста, помогите мне решить эту проблему.

У меня есть путь, так как все имена папок добавляются в древовидном виджете по адресу parentTreeItem.

Пример: если мне нужно изменить имя Aa2, то У меня

 String [] path ={A,Aa,Aa2};

Помогите мне с этим, это очень поможет.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Я полагаю, вам нужно иметь 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"] и начальная точка в path - index).

Метод #getFolderRecursive(Folder рекурсивно вызывает себя до тех пор, пока путь не пройден (пока индекс <путь.длина).Когда он пройден успешно (FolderNotfoundException?), Тогда index = path.length.На каждом уровне мы выполняем рекурсивный вызов с найденной папкой, соответствующей имени на этом уровне в пути (определяется индексом).На нижнем уровне папка, найденная с <code>#getFolder, является последней в пути и должна быть возвращена.Затем рекурсивные методы раскрываются, передавая f вверх по дереву в var folderArtPath (для ясности).Условие else устанавливает эту переменную при прохождении пути и переносе вверх по стеку в строке folderAtPath = в блоке if:

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

Возможно, есть лучший способ сделать это, ноЯ не могу проверить это сейчас.Потратил слишком много времени на это, но пришлось исправить мою мини-готовку.Рекурсия немного увлекательна ... найдите простой пример в сети и просто поиграйте с ним.

Вы также можете захотеть, чтобы папка и файл имели некоторый общий интерфейс.

0 голосов
/ 12 июня 2012

Если у вас есть путь, который вам не нужно перебирать в хэш-карте, просто получите значение для каждого элемента пути из соответствующей коллекции папок.

...