0

実装する必要があるかなり複雑なメソッドがあります。できるだけ簡単な方法で説明しようとしていますので、ご容赦ください。

ファイル名を表す文字列のセット A が与えられます。たとえば、「abc」、「def」、および「ghi」としましょう。これらの名前から、それぞれに「関連付けられた」ファイル名のセット B を導き出す必要があります。「def」の場合は「def_123」、「def_456」、「def_789」。「ghi」の場合は「ghi_123」、「ghi_456」、「ghi_789」。できることはこれくらい。ただし、これらの関連付けられたファイル名には、予測できない文字列であるプレフィックスまたはサフィックスが付いている場合があります。そのため、「abc」に関連付けられたファイル名は、実際には「HELLOabc_123WORLD」、「FOOabc_456BAR」、および「999abc_789000」になる可能性があります。(正規表現で言えば、上で書いた関連するファイル名の両側に * を付けるだけです)。つまり、関連付けられたファイル名は次のようになります。

*<original filename><other piece that I know>*

ここで、星は任意の数のランダムな文字を示します (0 の場合もあります)。

それがパズルの最初のピースです。

次に、関連付けられたファイル名のセット (セット B) と比較する文字列の別のセット C が与えられます。(ご参考までに、関連ファイルが特定のディレクトリにあるかどうかを確認しようとしており、そのディレクトリにファイル名のリストがあり、C を設定しています)。セット C 内の特定のファイルに関連するすべてのファイル名が見つかった場合は、セット A からそのファイルをチェックアウトできます。セット A 内の各ファイル名をチェックする必要があります。セット C で見つかった場合、そのファイルをセット A からチェックオフできます。

最後に、セット A からチェックされていないファイル名を返す必要があります (したがって、すべてが見つかった場合は何も返されません)。

このメソッドを実装する方法を考え出すのに苦労しています。次のように、ファイル名をセット A からそのファイル名に関連付けられたすべてのファイル名を含むリストにマップするマップを作成することを考えました。

Key        Value
abc        *abc_123*, *abc_456*, *abc_789*
def        *def_123*, *def_456*, *def_789*
ghi        *ghi_123*, *ghi_456*, *ghi_789*

次に、このマップの要素と要素の値をトラバースし、それらをセット C の文字列と比較します。特定のキーの値 (リスト) のすべての要素がセット C にある場合は、マークを付けることができます。その鍵は私のリストから外れています。残っているキーは返却されます。

これはうまくいくように思えますが、それをコードに組み込む実際のメカニズムは、私にとって非常に困難でした。ですから、私の考えを正しい方向に動かすための小さな提案や指針をいただければ幸いです。コードを提供したい場合に備えて、私の実装言語は Java になります。疑似コードも歓迎します。

4

2 に答える 2

0

問題の部分的な解決策を正しく特定したと思います。確かに Map が必要であり、本質的に問題は、特定のリスト内のすべての要素が C の文字列のセットに存在するかどうかを見つけることです。文字列のセット B または C を保持しているデータ構造がわかりません。しかし、残りの疑似コードを提供できます。

Initialize a HashMap<String, ArrayList>
for each string in set B
  if it matches the pattern *abc_*
     if "abc" is already in the Map
        get the value of this key in a temp list and append this string at the end of the list
     else
        add a new entry into the Map

   //follow the same for the other patterns.

for each entry in the Map
  traverse the list of values
    check if this value is present in the set C 
      if you reach the end of the list,
        remove the entry from the Map

そうすれば、返さなければならないキーだけが Map に残ります。

于 2013-04-24T04:58:14.877 に答える