添加未编号的对象数量

时间:2014-10-22 19:05:13

标签: java object arraylist tree

我有一个问题,我无法解决如何解决问题,我目前正致力于一个迷你文件系统,它需要创建大量的对象(理论上)。我目前尝试ArrayList<INode> nodes = new ArrayList<INode>();然后添加对象(INode)nodes.add(new INodeDirectory(paths[i]));

但是当我稍后检查此节点是否在nodes中执行时,是否有关于如何解决此问题或使用什么的建议?

MiniFs类:

package se.kth.id1020.minifs;

import edu.princeton.cs.introcs.StdOut;
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; //Number of objects created
  priate ArrayList<INode> nodes = new ArrayList<INode>();

  public MiniFs() {
    root = new INodeDirectory("/");
    map.put("/",n);
  }
  //Create a directory/folder
  @Override
  public void mkdir(String path) {
    String paths[] = path.split("/");
    if(paths.length == 2){
        nodes.add(new INode<directory(paths[paths.length - 1]));
        n++;
        map.put(paths[1],n);
        StdOut.println("OK.");
    }
    else{
        for(int i = 1; i < paths.length; i++){
            if(i == paths.length - 1){
                if(map.containsKey(paths[i])){
                    StdOut.println("Directory already excists");
                }
                else{
                    nodes.add(new INodeDirectory(paths[i]));
                    n++;
                    map.put(paths[i],n);
                    StdOut.println("OK.");
                }
            }
            else if(map.containsKey(paths[i]) == false){
                throw new UnsupportedOperationException("Error: you have to create " + paths[i] + " first!");
            }
        }
    }
  }
  //Create a file
  @Override
  public void touch(String path) {
    String paths[] = path.split("/");
    if(paths.length == 2){
        nodes.add(new INodeFile(paths[paths.length - 1]));
        n++;
        map.put(paths[paths.length - 1], n);
        StdOut.println("OK.");
    }
    else{
        for(int i = 1; i < paths.length; i++){
            if(i == paths.length - 1){
                if(map.containsKey(paths[i])){
                    StdOut.println("File already excists");
                } 
                else{
                    nodes.add(new INodeFile(paths[i]));
                    n++;
                    map.put(paths[i],n);
                    StdOut.println("OK.");
                }
            }
            else if(map.containsKey(paths[i]) == false){
                throw new UnsupportedOperationException("You have to create " + paths[i] + " first!");
            }
        }
    }
  }
  //Create a pointer to a file or directory
  @Override
  public void ln (String path, String target){
      String paths[] = path.split("/");
      String targets[] = target.split("/");
      if(paths.length == 2 && targets.length == 2 && map.containsKey(paths[1]) && map.containsKey(targets[1])){
          int pathIndex = nodes.indexOf(paths[1]);
          int targetIndex = nodes.indexOf(targets[1]);
          nodes.get(pathIndex).setPointer(nodes.get(targetIndex));
          StdOut.println("OK.");
      }
  }
}

INode类:

package se.kth.id1020.minifs;

public abstract class INode {

  private String name;
  private ArrayList<INode> pointer;
  private long accessTime;

  public INode(String name) {
    this.name = name;
    this.accessTime = System.currentTimeMillis();
  }

  public void setPointer(INode n) {
      pointer.add(n);
  }

  public long getAccessTime() {
    return accessTime;
  }

  public void setAccessTime(long accessTime) {
    this.accessTime = accessTime;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

INodeDirectory类:

package se.kth.id1020.minifs;

public class INodeDirectory extends INode {

  public INodeDirectory(String name) {
    super(name);
  }
}

INodeFile类:

package se.kth.id1020.minifs;

public class INodeFile extends INode {

  public INodeFile(String name) {
    super(name);
  }
}

2 个答案:

答案 0 :(得分:2)

您需要覆盖.equals()以查找您放入ArrayList并使用.contains().indexOf()进行核对的任何内容。

让IDE帮助解决这个问题非常容易。我强烈建议您实施.hashCode(),以防以后想要使用HashMap(否则您会遇到类似的问题)。

然而,你有一个更严重的问题,那就是当你检查它是否在那里时,你将String传递给indexOf()而不是INode。这将失败,因为列表不存储字符串。如果要检查节点是否存在,则需要从String创建一个新节点,并检查它是否存在。

答案 1 :(得分:0)

您正在尝试检查ArrayList是否包含INode类的某个实例。但是,您没有定义如何比较两个INode。 ArrayList.contains()使用INode类的默认.equals()方法,除非在INode类中使用@Override覆盖它,否则它实际上不起作用。如果您正在使用Eclipse,则可以通过按Alt + Shift + S并选择&#34;生成哈希码()和等于()

来轻松生成.equals()和.hashCode()函数。