Система иерархии файлов с логическим вопросом веб-приложения: поиск по списку - PullRequest
0 голосов
/ 31 мая 2010

Мне нужно найти список папок, в которых может быть больше папок, и добавьте новую папку в зависимости от того, какая папка является ее родительской (путь хранится в виде строки, например, для = = root / MyCom / home / "). Затем я заполняю поле новым именем папки и добавляю его в конечную папку (например, "home /").

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

как я могу добавить папку в список папок, который может быть в списке папок, который может быть в списке папок и даже больше?

      YFUser user = (YFUser)getSession().getAttribute(SESSION_USER);

      Folder newFolder = new Folder();
      newFolder.setFolderName(foldername);

              // this is the path string (root/MyCom/home/) split in the different folder names

      String folderNames[] = folderLocationString.split("/");
      int folderNamesLength = folderNames.length;

      Folder root = user.getRoot();

      Folder currentFolder = root;

      for(int i=0;i<folderNamesLength; i++){
         // because root is folderNames[i]

          String folderName = folderNames[i];

          int currentFolderSize = currentFolder.getChildren.getSize();

          for(int o=1; o<= currentFolderSize ; o++){

              if(currentFolder.getChildren().get(o) instanceof Folder){
                if(folderName.equals(currentFolder.getChildren().get(o).getFolderName())){

                    currentFolder = currentFolder.getChildren().get(o);

                    if  (i == counter){
//now i am inside the correct folder and i add it to the list of folders within it
//the trouble is knowing how to re add this changed folder back to the list before it

                        currentFolder.getChildren.add(newFolder);
                    }

                }
              }
          }

      }

это простая версия того, что мне нужно сделать

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {

    List<String> strings = new ArrayList<String>();

    strings.add("Donkey");
    strings.add("hello");
    strings.add("me");
    strings.add("you");
    strings.add("everyone");
    strings.add("not u");

    int counter= strings.size();

    for (int i=0 ; i< counter ; i++){
        System.out.println(strings.get(i));
        if(strings.get(i).equals("Donkey")){
            strings.remove(i);
            strings.add(i, "not a Donkey");
        }
    }

    for(String s : strings){
        System.out.println(s);
    }
    }
}

это распечатает Осел, привет, я, ты, все, а не ты

, а затем

не осел, привет, я, ты, все, а не ты,

как вы можете видеть здесь, я заменяю строку "Donkey" на "not Donkey"

так что с точки зрения моего проекта, мне нужно получить родительскую папку из списка, добавить новую папку и затем удалить старую родительскую папку с новой обновленной.

редактирование:

это мой класс папок, который содержит список объектов иерархии, который может быть либо fileInformations, либо Folders, `

пакет com.example.client;

@Entity
@DiscriminatorValue("F")
public class Folder extends Hierarchy   {

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "FOLDER_JOIN_FILELOCATION", joinColumns = { 
        @JoinColumn(name = "folder_id") }, inverseJoinColumns = { 
        @JoinColumn(name = "file_information_id") })
private List<Hierarchy> children = new ArrayList<Hierarchy>() ;
@Column(name = "folder_name")
private String folderName;
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
   @JoinTable(name="FOLDER_JOIN_FOLDER",
        joinColumns = @JoinColumn(name="parent_folder_id"),
        inverseJoinColumns = @JoinColumn(name="folder_ID")
    ) 
private Hierarchy parent;



public Folder(){

}

public String getFolderName() {
    return folderName;
}

public void setFolderName(String folderName) {
    this.folderName = folderName;
}

public List<Hierarchy> getChildren() {
    return children;
}

public void setChildren(List<Hierarchy> children) {
    this.children = children;
}




@Override
public void addChild(Hierarchy h) {
    children.add(h);        
}



public Hierarchy getParent() {
    return parent;
}

public void setFolder(Hierarchy folder) {
    this.parent = folder;
}

@Override
public String toString() {
    String val = this.folderName;
    val += "/";
    for(Hierarchy h : children ){

        val += h.toString();

    }

    return val;


}


public Hierarchy getChild(int index){
    return children.get(index);
}

 }

теперь этот пример ниже, когда я вынимаю элемент списка, редактирую его, я думаю, что Питер говорит, что это отредактирует список напрямую, но когда я запускаю этот код, он не

    List<String> strings = new ArrayList<String>();

    strings.add("Donkey");
    strings.add("hello");
    strings.add("me");
    strings.add("you");
    strings.add("everyone");
    strings.add("not u");

    int counter= strings.size();


for (int i=0 ; i< counter ; i++){
        System.out.println(strings.get(i));
        if(strings.get(i).equals("Donkey")){
            String test = strings.get(i);
            test += " not now though";
        }
    }

    for(String s : strings){
        System.out.println(s);
    }

`

1 Ответ

0 голосов
/ 31 мая 2010

Я не уверен, правильно ли понял вашу проблему. Вы говорите

Моя проблема в том, что я не могу гарантировать, что элемент currentFolder вернется в список, из которого он пришел

Однако, насколько я понимаю, currentFolder уже находится в списке, и простое изменение состояния currentFolder не влияет на этот факт. Во всех известных мне реализациях списка вызов get() просто возвращает ссылку на элемент в списке, не удаляя этот элемент. Если вы явно не удалите currentFolder из содержащего его списка, он останется там.

В любом случае, в общем случае решение подобных проблем заключается в сохранении ссылки на родителя текущей папки:

  Folder currentFolder = root;
  Folder parentFolder = null;

  for(int i=0;i<folderNamesLength; i++){
     // because root is folderNames[i]

      String folderName = folderNames[i];

      int currentFolderSize = currentFolder.getChildren.getSize();

      for(int o=1; o<currentFolderSize ; o++){

          if(currentFolder.getChildren().get(o) instanceof Folder){
            Folder childFolder = currentFolder.getChildren().get(o);

            if(folderName.equals(childFolder.getFolderName())){
                parentFolder = currentFolder;
                currentFolder = childFolder;

                if  (i == counter){
                    currentFolder.getChildren.add(newFolder);
                    // reorganize parentFolder.getChildren() or whatever
                }

            }
          }
      }

  }

Примечание с одной стороны: во внешней петле

for(int i=0;i<=folderNamesLength; i++){

Вы идете слишком далеко - условие должно быть

for(int i=0;i<folderNamesLength; i++){

То же самое относится и к внутренней петле.

Кроме того, вы увеличиваете i как над, так и внутри цикла:

String folderName = folderNames[i++];

должно быть

String folderName = folderNames[i];
...