说实话,我正在创建一个名为'Directory'的类,它处理/提供目录操作,例如读取目录数据,检查以与案例无关的方式查看目录中存在的名称,添加名称目录,从目录中删除名称,并将更新的目录写入文件Directory.txt。我坚持使用我正在尝试创建的方法,该方法应该从数组中删除元素,并将所有以下元素向下移动一个位置。这是我这个类的完整代码,似乎没有正常工作的方法是delete():
package homeworks;
import java.util.*;
import java.io.*;
public class Directory {
// max directory size = 1024
final int maxDirectorySize = 1024;
String directory[] = new String[maxDirectorySize];
int directorySize = 0;
File directoryFile = null;
Scanner directoryDataIn = null;
//constructor
Directory(String directoryFileName) {
directoryFile = new File(directoryFileName);
try {
directoryDataIn = new Scanner(directoryFile);
}
catch (FileNotFoundException e) {
System.out.printf("File %s not found, exiting!",directoryFileName);
System.exit(0);
}
// Loading Directory
while (directoryDataIn.hasNext()){
directory[directorySize++] = directoryDataIn.nextLine();
}
}
public boolean inDirectory(String name) {
for(int i=0; i<directorySize; i++){
if(directory[i].equalsIgnoreCase(name)){
return true;
}
}
return false;
}
public boolean add(String name) {
// add to directory if directory is not full
// directory size is increased by 1
// returns true if successful; false otherwise
if(directorySize<maxDirectorySize){
directory[directorySize++] = name;
return true;
}
else{
return false;
}
}
public boolean delete(String name) {
// if name is in directory, remove it and shift
// other entries to use freed space; directory size
// is reduced by 1
// returns true if successful; false
for(int i = 0; i<directorySize;){
if(directory[i].equalsIgnoreCase(name)){
for(int c = i; c<directorySize+1; c++){
directory[c] = directory[c++];
}
for(int c =0; c<directorySize; c++)
System.out.println(directory[c]);
return true;
}
i++;
}
return false;
}
public void closeDirectory() {
directoryDataIn.close();
for(int i = 0; i < directorySize; i++){
System.out.println(directory[i]);
}
// close explicitly before writing
PrintStream directoryDataOut = null;
// now open the directory data file for writing
try {
directoryDataOut = new PrintStream(directoryFile);
}
catch (FileNotFoundException e) {
System.out.printf("File %s not found, exiting!", directoryFile);
System.exit(0);
}
// write possibly updated directory back to file
for (int i = 0; i < directorySize; i++)
directoryDataOut.println(directory[i]);
directoryDataOut.close();
}
}
我遇到的另一个问题是最后一个方法closeDirectory()。我想知道你究竟要检查数组是否被更改,以确定是否必须重写该文件。我知道使用'ArrayLists'会更简单,但我必须特别为这个项目使用数组。我试图创建一个名为'originalDirectory'的数组,它只是构造函数中数组'directory'的副本。但是,我无法理解(之后我将其删除)。
答案 0 :(得分:0)
以下代码片段看起来有点奇怪。
for(int c = i; c<directorySize+1; c++){
directory[c] = directory[c++];
}
当您致电directory[c] = directory[c++];
时,您正在递增c
。你已经在for循环中做了这个,所以结果就是你将它递增两次。
我认为你不需要那样做。
尝试
directory[c] = directory[c+1];
你的循环条件:c<directorySize+1
看起来也很麻烦。如果在directory[c] = directory[c+1];
是c
数组的最大大小时调用directory
,那么您将获得索引超出范围的异常。我了解directorySize
可能不一定总是与directory.length
相同,但您可能希望有代码来解释这一点。