1

iPadアプリケーションには、次のファイルを含むフォルダーがあります。

1-1-xxxx.dat
1-2-xxxx.dat
...
1-999-xxxx.dat
2-1-xxxx.dat
...
...
999-999-xxxx.dat

パーツxxxxは、ファイルの作成時に実行時に決定される文字です。各ファイルの内容は前のファイルの内容に依存するため、作成する各ファイルで、前のファイルを照会する必要があります。xxxx問題は、 「xxxx」の部分が本質的にランダムであるため、前のファイルのプレフィックスしか知らず、部分は知らないということです。(xxxx部分自体xxxxは前のファイルの部分によって決定され、1-1-xxxxファイルにはランダムな名前が付けられます)。

ファイルにアクセスするには、最初のアプローチは次のようになります。

// For file 1-50-xxxx.dat
NSError *error = nil;
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *allFiles = [fm contentsOfDirectoryAtPath:path error:&error];

for (NSString *file in allFiles) {
    if ([file hasPrefix:@"1-49-"]) {
        // Determine contents and name of file "1-50-xxxx.dat"
        // Create file, break, etc.
    }
}
// ... And repeat for many files

これは明らかに非常にすぐに非常に高価になります。指定された数値プレフィックスを持つファイルは1つしかないため、必要なファイルのパスを取得するO(1)の方法はありますか?

4

1 に答える 1

2

名前の辞書を作成してから、その辞書でパスを検索してみませんか?辞書キーはプレフィックスであり、値はフルパスです。

すなわち:(擬似コード)

// Build the path dictionnary, that is done only once
currentPrefix = ...
previousXXX   = null
foreach file
  currentXXX = computeXXX( previousXXX )
  dictionnary.put( currentPrefix, computePath( currentPrefix, currentXXX )

  // Remember for next iteration
  previousXXX = currentXXX 
  currentPrefix++
endforeach

次に、プレフィックスを知っていると、パスを取得するのは簡単で高速です(もちろん、使用する辞書の実装によって異なります):dictionnary.get(prefix)


ファイルのコンテンツを作成するには、同じロジックを適用するだけです。各反復で、前のファイルのコンテンツ/サフィックスを記憶し、最初から再度計算するのではなく、それを使用します。

于 2012-12-02T11:26:37.287 に答える