Java 添加数量不多的对象
我有一个问题无法解决,我目前正在开发一个迷你文件系统,它需要创建大量的对象(理论上)。我当前尝试了Java 添加数量不多的对象,java,object,arraylist,tree,Java,Object,Arraylist,Tree,我有一个问题无法解决,我目前正在开发一个迷你文件系统,它需要创建大量的对象(理论上)。我当前尝试了ArrayList nodes=new ArrayList()
ArrayList nodes=new ArrayList()然后当我添加一个对象(INode)nodes.add(newinodedirectory(path[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.");
}
}
}
污染等级:
package se.kth.id1020.minifs;
public class INodeFile extends INode {
public INodeFile(String name) {
super(name);
}
}
对于放入数组列表
并使用检查的任何内容,您需要覆盖.equals()
,并使用.contains()
或.indexOf()
进行检查
很容易让您的IDE来帮助实现这一点。我强烈建议您也实现.hashCode()
,以防以后要使用HashMap
(否则会遇到类似问题)
但是,您还有一个更严重的问题,那就是当您检查它是否在那里时,您正在将字符串
传递给indexOf()
,而不是INode
。这将失败,因为列表不存储字符串。如果要检查节点是否存在,则需要从字符串创建新节点,并检查该节点是否存在。您正在尝试检查ArrayList是否包含INode类的特定实例。但是,您没有定义如何比较两个索引节点。ArrayList.contains()使用INode类的默认.equals()方法,除非在INode类中使用@Override重写它,否则该方法实际上不会工作。如果您使用的是Eclipse,则可以通过按Alt+Shift+S并选择“generate hashCode()and equals()”轻松生成.equals()和.hashCode()函数,因为您没有重写INode类中的equals方法,所以我不希望contains起作用(除非您将它与要检查列表是否包含它的对象使用相同的引用)。但我并没有真正在我的数组列表上使用.contains()
,或者在使用.getIndexOf()时使用.contains()
是“秘密”的吗
?查找元素(如果有)。顺便说一句,我强烈建议不要创建一个equals()
方法,该方法允许将索引节点
与字符串
进行比较,因为它会违反
无法解决问题,它仍然无法找到我的objects@Necrozze我也更新了答案,提到了.indexOf()
,但原理相同。
package se.kth.id1020.minifs;
public class INodeDirectory extends INode {
public INodeDirectory(String name) {
super(name);
}
}
package se.kth.id1020.minifs;
public class INodeFile extends INode {
public INodeFile(String name) {
super(name);
}
}