これをJavaで実装しています。
Symbol file Store data file
1\item1 10\storename1
10\item20 15\storename6
11\item6 15\storename9
15\item14 1\storename250
5\item5 1\storename15
ユーザーはワイルドカードを使用して店舗名をstorename?
検索します。私の仕事は店舗名を検索し、シンボル データを使用して完全な文字列を生成することです。例えば:
item20-店名1 item14-
店名6 item14-
店名9
私のアプローチは次のとおりです。
- ストア データ ファイルを 1 行ずつ読み取る
- いずれかの行に一致する検索文字列 ( など
storename?
) が含まれている場合、その行を中間ストア結果ファイルにプッシュします - また、一致するストア名の itemno を配列リスト (10,15 など) にコピーします。
- この arraylist size%100==0 の場合、ハッシュセットを使用して重複する項目番号を削除し、arraylist のサイズを大幅に削減します
arraylist サイズ >1000 の場合
- を使用してそのリストを並べ替えます
Collections.sort(itemno_arraylist)
- シンボル ファイルを開き、1 行ずつ読み取りを開始する
- 行ごとに
Collections.binarySearch(itemno_arraylist,itmeno)
- 一致する場合は、結果を中間シンボル結果ファイルにプッシュします
- を使用してそのリストを並べ替えます
step1をストアデータファイルのEOFまで続ける
...
このすべての後、2 つの結果ファイル (シンボル結果ファイルとストア結果ファイル) を組み合わせて、実際の文字列リストを表示します。
このアプローチは機能していますが、より多くの CPU 時間とメイン メモリを消費しています。
CPU時間(現在2分)とメモリ(現在80MB)を削減した、より良い解決策を知りたいです。Java で使用できるコレクション クラスは多数あります。この種の巨大な文字列処理の問題に対して、より効率的な解決策を提供するのはどれですか?
この種の文字列処理の問題について何か考えがある場合は、Java でもそれが役に立ちます。
注: どちらのファイルも 100 万行近くの長さになります。