-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

先生が特定の方法を必要とする場合は、おそらくクラスでもっと注意深く聞くべきでした:-)

次のように、配列を 1 つずつ拡張できます。

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 ループの使用方法を練習することであり、実際に問題を適切に解決することではありません。

List使用する配列を拡張する最も簡単な方法は、何らかの形式の を使用することですjava.util.ArrayList。たとえば、リストにデータの格納を処理させ、終了したらリストのtoArray()メソッドを呼び出します。

于 2013-01-23T04:16:07.640 に答える
0

これに配列を使用するという要件がまったく意味をなさないという事実を無視します。あなたがしたいのは、最初の配列に特定のサイズを割り当て、ストレージスペースの終わりに達するたびに設定された量だけそれを増やすことです。通常、スペースが不足するたびに、基盤となるストレージを2倍に増やします。ここにいくつかの擬似コードがあります:

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 に答える
0

使用する

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

arrayあるものを別のものにコピーする方法array

于 2013-01-23T03:49:15.263 に答える