我有一个问题,我无法解决如何解决问题,我目前正致力于一个迷你文件系统,它需要创建大量的对象(理论上)。我目前尝试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);
}
}
答案 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()函数。