-1

我正在尝试将文本文件中的信息存储到数组中,但该项目要求我们通过创建一个临时数组并在我们读取更多文件以容纳新对象时增加其大小来做到这一点。我怎样才能做到这一点?

/**
 * reads a csv data file and returns an array of acquaintances
 * @param path File path of CSV file
 * @return Acquaintances from the file
 */
public static Acquaintance[] read (String path)  {
    //create an array of acquaintances 
    Acquaintance[] acqs = new Acquaintance[0];

    //open the file
    try {
        BufferedReader file = new BufferedReader(new FileReader(path));

        //read the file until the end
        String line;

        while( (line = file.readLine()) != null) {
            // parse the line just read
            String[] parts = line.split(",");

            //create an acquaintance object
            Acquaintance a = new Acquaintance(parts[0], parts[1], Double.parseDouble(parts[2]));

            acqs[0] = a;

            //Add the object to the array

            //(1) create a new Acquaintance array, with one extra element
            Acquaintance[] tmp = new Acquaintance[acqs.length+1];

            //(2) copy all old elements into new
            Acquaintance[] tmp = acqs.clone();

            //(3) assign new Acquaintance object to last element of the array

            //(4) assign new array's address to acqs
            //for loop
        }
4

3 回答 3

6

如果您的老师需要特定的方法,您可能应该在课堂上更仔细地听:-)

您可以像这样增加一个数组:

myArray = Arrays.copyOf(myArray,myArray.length+1);

但是看不到 for 循环。您可以使用较旧的 Java 方法来执行此操作,如下所示:

Object[] tmpArray = new Object[myArray.length+1];
System.arraycopy(myArray,0,tmpArray,0,myArray.length);
myArray = tmpArray;

同样,不需要 for 循环。唯一的优点是它可以与 Java 1.5 一起运行。在这个问题中,for 循环的唯一“需要”是更有效地执行System.arraycopy(由 使用的Arrays.copyOf)执行的操作。像这样:

Object[] tmpArray = new Object[myArray.length+1];
for(int i=0;i<myArray.length;i++) tmpArray[i]=myArray[i];
myArray = tmpArray;

因此,这个想法是让您练习使用 for 循环,而不是真正以一种好的方式解决问题。

在使用时增加数组的最简单方法是使用某种形式Listjava.util.ArrayList例如,让列表处理存储数据,并在toArray()完成后调用列表的方法。

于 2013-01-23T04:16:07.640 回答
0

利用

Arrays.copyOfRange(T[] original,int from, int to) 

复制一个array到不同的方法array

于 2013-01-23T03:49:15.263 回答
0

我将忽略这样一个事实,即为此使用数组的要求毫无意义。您要做的是为您的初始数组分配一个给定的大小,并在您到达存储空间的末尾时将其增加一个设定的数量。通常,只要空间不足,您就会将底层存储增加两倍。下面是一些伪代码:

public Acquaintance[] getAcquaitances(final String path) {
    if(path == null) return null;

    int count = 0, initialSize = 16;
    Acquaintance[] temporaryArr = new Acquaintance[initialSize];

    // Open file here

    String line = null;
    while((line = file.readLine()) != null) {
        if(count >= temporaryArr.length) {
            Acquaintance[] switch = temporaryArr;
            temporaryArr = new Acquaintance[switch.length * 2] // increase size by factor of 2
            for(int i = 0; i < switch.length; i++) {
                temporaryArr[i] = switch[i];
            }
         }

         temporaryArr[count] = createAcquantainceFromLine(line);

         ++count;
     }

     Acquaintance[] results = new Acquaintance[count];
     for(int i = 0; i < count; i++) {
         results[i] = temporaryArr[i];
     }

     return results;
}

稍作修改,上面的代码应该适合你。研究它,嵌入它,然后完全忽略它,如果您将来需要扩展数组,请改用ArrayList。或System.arraycopy

于 2013-01-23T04:28:35.807 回答