有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

遍历树时出现java索引越界异常

我为家庭作业创建的迷你文件系统有问题。当前的任务是执行“查找”操作,该操作基本上可以查找具有您发送的名称的文件夹或文件。当我遍历它的父目录时,我不起作用,但棘手的部分是当我试图从目录/文件夹中获取路径时,这些目录/文件夹有一个指向目标目录/文件的指针,或者一个目录以某种方式是目标的父目录

例如: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) 个答案

  1. # 1 楼答案

    通过这样做找到了解决方案

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