У меня проблемы с моей мини-файловой системой, которую я создаю для домашней работы. Текущее назначение - реализовать поиск операции, который в основном находит папку или файл с именем, которое вы отправляете. Я работаю, когда я просматриваю его родителей, но сложная часть - это когда я пытаюсь получить пути от каталогов/папок, которые имеют указатель на целевой каталог/файл или каталог, который каким-то образом является родителем для цели.Индекс из связанного исключения при обходе дерева
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();
}
}
}
Пробовали ли вы отладчик? – talex
@talex yeah, и кажется, что это происходит потому, что когда дело доходит до каталога, который указывает на другой, он проходит и родительский указательный каталог является root, поэтому цикл while останавливается. Поэтому мне нужно каким-то образом пройти через целевые родители, и когда у одного из родителей есть указатель, указывающий на это, он должен остановиться и пройти через это и пройти через его родителей. – Necrozze