0

配列をテキストファイルに正しく保存するのに苦労しています。テキスト ファイルは 1 行に 1 エントリの形式でフォーマットされているため、これを使用します。

var newFavString:String = arFavourites.join("\r\n");

    favStream.open(favFile, FileMode.WRITE);
    favStream.writeUTFBytes(newFavString);
    favStream.close();

しかし、どこかで、いくつかの配列エントリ内のスペースが原因である可能性がある空白行を追加していますが、それは結合プロセスには影響しないはずです。

念のためこれを使用して配列をクリーンアップしましたが、トレースに未定義のオブジェクトがいくつか表示されます。

for (i=0; i<arFavourites.length-1; i++) {
        if (arFavourites[i] == undefined) {
        arFavourites.splice(i,1);
        }
        trace(arFavourites[i]);
    }

そして、これは私がデータを配列にインポートする方法です:

var favFile:File = File.userDirectory;
favFile = favFile.resolvePath("favourites.txt");
var favStream:FileStream = new FileStream();

var arFavourites = new Array();
var FavCount:int = 0;

favStream.open(favFile, FileMode.READ);
var fileContents:String = favStream.readUTFBytes(favStream.bytesAvailable);


    arFavourites = fileContents.split("\r\n");

    for (i=0; i<arFavourites.length-1; i++) {
        if (arFavourites[i] == undefined) {
        arFavourites.splice(i,1);
        }
    }

favStream.close();

何かを削除するときは、配列内で検索してつなぎ合わせます。多分エラーはそこにあります。

var k:int;
    var i:int;
    trace("Selected Index: " + dg.selectedIndex);
    if (dg.length == 0) {
        return;
    }
    for (k=0; k<dg.length; k++) {
        if (dg.isItemSelected(dg.getItemAt(k))) {
            for (i=0; i<arFavourites.length; i++) {
                if (arFavourites[i] == dg.getItemAt(k)[1]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[2]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[3]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[4]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[5]) {
                    arFavourites.splice(i,1);
                    }
            }
            dg.removeItemAt(k);
            dg.scrollToIndex(k);
            dg.clearSelection();
            break;
        }
    }
    for (i=0; i<arFavourites.length-1; i++) {
        if (arFavourites[i] == undefined) {
        arFavourites.splice(i,1);
        }
    }
    var newFavString:String = arFavourites.join("\r\n");
    trace(newFavString);

    favStream.open(favFile, FileMode.WRITE);
    favStream.writeUTFBytes(newFavString);
    favStream.close();

配列に何かが追加または削除されると、テキスト ファイルが更新されます。本当にシンプルなものだと確信しており、迅速な対応に大いに感謝します =) ありがとう

4

2 に答える 2

0

これは実際には、配列から物事をフィルタリングする方法ではありません (非効率的であり、一部が欠けています):

private function test():void
{
    var tester:Array = [];
    tester[1] = 1;
    tester[2] = 2;
    tester[4] = 3;
    tester[6] = 4;
    // 1-2-3-4
    trace(removeEmptyElements(tester).join("-"));
}

public static function removeEmptyElements(array:Array):Array
{
    var result:Array = new Array(array.length);
    for (var i:int, j:int; i < array.length; i++)
        if (array[i] != undefined) result[j++] = array[i];
    result.length = j;
    return result;
}

これはそれを行う方法です。また、相互に排他的な条件 (またはgetitemAt副作用があるかどうか) をテストする if ステートメントを統合することもできます。それ以外の場合は、バグのように見えます。

于 2013-01-15T13:50:21.753 に答える
0

わかりましたので、最終的に実用的な解決策を見つけました。を取得することで、selectedIndexどの配列要素が dataGrid 行に一致するかを把握し、それをつなぎ合わせることができました。

選択されたインデックス:

arFavourites.splice(dg.selectedIndex*5,5);

DataGrid から行を削除します。

for (k=0; k<dg.length; k++) {
        trace(dg.length);
        if (dg.isItemSelected(dg.getItemAt(k))) {
            dg.removeItemAt(k);
            dg.scrollToIndex(k);
            dg.clearSelection();
        }}

テキストファイルの書き換え:

var newFavString:String = arFavourites.join("\r\n");
    trace(newFavString);
    favStream.open(favFile, FileMode.WRITE);
    favStream.writeUTFBytes(newFavString);
    favStream.close();
于 2013-01-15T18:49:27.137 に答える