Java类方法:使用for循环编辑字符串数组

时间:2015-03-26 15:26:46

标签: java

说实话,我正在创建一个名为'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'的副本。但是,我无法理解(之后我将其删除)。

1 个答案:

答案 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相同,但您可能希望有代码来解释这一点。