0

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

Ex: Директивы/a/b/c (/ c - цель) и каталоги/d/e, теперь, если/e или/d указывает на/b или/c, он отлично работает, но когда я указываю/d to/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(); 
      } 
     } 
    } 
+0

Пробовали ли вы отладчик? – talex

+0

@talex yeah, и кажется, что это происходит потому, что когда дело доходит до каталога, который указывает на другой, он проходит и родительский указательный каталог является root, поэтому цикл while останавливается. Поэтому мне нужно каким-то образом пройти через целевые родители, и когда у одного из родителей есть указатель, указывающий на это, он должен остановиться и пройти через это и пройти через его родителей. – Necrozze

ответ

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

Рад, что вы его нашли - примите ваш ответ. Также (в вашем вопросе) старайтесь избегать горизонтальных полос прокрутки - код должен быть 80 символов –

Смежные вопросы