【问题标题】:File Hierarchy system with a web application logic question: List searching带有 Web 应用程序逻辑问题的文件层次结构系统:列表搜索
【发布时间】:2010-05-30 21:15:47
【问题描述】:

我需要搜索可能包含更多文件夹的文件夹列表, 并根据其父文件夹添加一个新文件夹。(路径存储为字符串,例如 =“root/MyCom/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);
    }
    }
}

这将打印出驴,你好,我,你,每个人,而不是你

然后

不是驴子,你好,我,你,大家,不是你,

正如您在此处看到的,我将“驴”字符串替换为“不是驴”

所以就我的项目而言,我需要从列表中获取父文件夹,添加新文件夹,然后使用新的更新文件夹删除旧的父文件夹。

编辑:

这是我的文件夹类,它包含一个层次对象列表,可以是文件信息或文件夹,`

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

`

【问题讨论】:

    标签: java gwt arraylist logic traversal


    【解决方案1】:

    我不确定是否正确理解了您的问题。你说

    我的问题是我无法确保 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];
    

    【讨论】:

    • 好的所以我改变了他们彼得,但这不是我想要的,我想要的是能够将文件夹添加到字符串路径上的最终文件夹并确保效果感受所有受影响的清单。
    • @Péter Török 是彼得,但是当我重新组织父文件夹时,这只是@peter 影响父文件夹本地变量,而不是列表中的父文件夹实体本身。我知道我使用 get(0) 获得了对该文件夹的引用(如果我编辑此引用,它不会编辑列表中的那个),我已经提供了一个我需要的简单版本
    • @molleman, AFAIU 唯一可行的方法是getChildren()get() 返回一个copy of,而不是对原始文件的引用。请澄清是哪种情况(最好通过发布来自Folder 的相关代码位,如果适用的话,来自children 集合)。
    • @molleman,您说的是数据库中的表,用 JPA 映射!伙计,从你那里得到这条关键信息需要一些努力......所以你希望本地实体中的更改也在数据库中更新,对吧?假设用户及其根文件夹已经持久化,因为你有cascade = CascadeType.ALL,我认为你不需要做任何特别的事情,除了可能调用entityManager.flush() 来强制将整个对象图中的更改同步到数据库。
    • @Péter Török,如果我想更新层次结构列表,我只需调用休眠 session.update(user);但我想将新文件夹添加到现有文件夹中,然后更新我的 YFUser 实体中的列表。当我从中取出一个文件夹并且它是一个与路径匹配的文件夹时,然后进入该文件夹并搜索路径上的下一个文件夹(依此类推),但是当我找到最终文件夹以将新文件夹添加到其中,因此我无法更新我的数据库,因为该文件夹尚未添加,然后调用 hibernate session.update(user);
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2013-01-17
    • 2019-02-09
    • 1970-01-01
    • 2016-03-29
    • 2011-05-26
    相关资源
    最近更新 更多