遍历树时索引超出范围的异常

时间:2014-10-23 14:01:46

标签: java algorithm tree indexoutofboundsexception tree-traversal

我的迷你文件系统出现问题,我正在创作作业。当前的分配是实现操作查找,它基本上找到了你发送的名称的文件夹或文件。当我遍历它的父母时,我不行,但是当我试图从中获取路径时,棘手的部分是directorys /文件夹,指向目标目录/文件或某个目标的目录。

Ex:Directorys / a / b / c(/ c是目标)和directorys / d / e,现在如果/ e或/ d指向/ b或/ c它工作正常,但当我指向/ d到/ a输出为:/ d / a / c。它通过/ b执行。有关如何解决此问题的任何提示?

更新了这个,以便它通过目标父项,直到它到达被指向的父项并且它转到指针并通过它的父项。但是现在它正在抛出一个IndexOutOfBoundsException。

MiniFs类:

package se.kth.id1020.minifs;

import edu.princeton.cs.introcs.StdOut;
import java.util.ArrayList;
import java.util.HashMap;

public class MiniFs implements FileSystem {

  private final INodeDirectory root;
  private HashMap<String,Integer> map = new HashMap<String, Integer>();
  private int n = 0;
  private ArrayList<INodeDirectory> directoryNodes = new ArrayList<INodeDirectory>();
  private ArrayList<INodeFile> fileNodes = new ArrayList<INodeFile>();
  private HashMap<String, INodeDirectory> pointer = new HashMap<String, INodeDirectory>();

  public MiniFs() {
    root = new INodeDirectory("/");
    map.put("/",n);
  }

  @Override
  public void find (String target){
      if(!map.containsKey(target)){
          StdOut.println(target + " does not excist!");
      }
      else if(target.endsWith(".txt")){
          INodeFile targetNode = new INodeFile(target);
          int index = fileNodes.indexOf(targetNode);
          INodeDirectory parent = fileNodes.get(index).getParent();
          ArrayList<String> path = new ArrayList<String>();
          ArrayList<String> links = new ArrayList<String>();

          path.add(root.getName());
          int cnt = 1;
          while(parent != root){
              path.add(parent.getName());
              links.add(parent.getName());
              path.add("/");
              index = directoryNodes.indexOf(parent);
              parent = directoryNodes.get(index).getParent();
              cnt++;
          }
          path.add(target);
          for(int i = 0; i < path.size(); i++){

              if(i > 0 && i < path.size()-1){
                  StdOut.print(path.get(cnt));
                  cnt--;
              }
              else{
                  StdOut.print(path.get(i));
              }
          }
          StdOut.println();
          path.clear();

          int targetIndex = fileNodes.indexOf(targetNode);
          for(int i = 0; i < links.size(); i++){
              parent = fileNodes.get(targetIndex).getParent();
              StdOut.println("Parent: " + parent.getName());
              path.add(root.getName());
              cnt = 1;
              while(parent.getName() != links.get(i)){
                  path.add(parent.getName());
                  path.add("/");
                  index = directoryNodes.indexOf(parent);
                  parent = directoryNodes.get(index).getParent();
                  StdOut.println("Parent W: " + parent.getName());
                  cnt++;
              }
              path.add(links.get(i));
              path.add("/");
              cnt++;
              parent = pointer.get(links.get(i));
              while(parent != root){
                  StdOut.println("Parent W2: " + parent.getName());
                  path.add(parent.getName());
                  path.add("/");
                  index = directoryNodes.indexOf(parent);
                  parent = directoryNodes.get(index).getParent();
                  cnt++;
              }
              path.add(target);
              StdOut.println("Path size: " + path.size() + " cnt: " + cnt);
              for(int j = 0; j < path.size(); j++){
                  if(j > 0 && j < path.size() - 1){
                      StdOut.print(path.get(cnt)); <---- IOOB thrown here
                      cnt--;
                  }
                  else{
                      StdOut.print(path.get(j));
                  }
              }
              path.clear();
              StdOut.println();
          }
      }
   }

1 个答案:

答案 0 :(得分:0)

通过

找到解决方案
int x = path.size() - 3;
for(int j = 0; j < path.size(); j++){
    if(j > 0 && j < path.size() - 1){
        StdOut.print(path.get(x));
            x--;
     }
     else{
         StdOut.print(path.get(j));
     }
 }