2013-04-24 54 views
0

我有一個相當複雜的方法,我需要實現相關的兩套比較字符串的。所以請耐心等待,因爲我試圖用盡可能簡單的方式來描述它。實現一個複雜的方法,當一個組與第三

我給代表的文件名字符串的一組A - 讓我們說「ABC」,「DEF」和「GHI」。我必須從這些名稱中爲每個名稱派生出一組「關聯」的文件名稱 - 讓我們假設「abc」爲「abc_123」,「abc_456」和「abc_789」; 「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中的每個文件名,並且如果集B中的所有關聯文件名都是在集合C中發現,我可以從集合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。僞代碼也是受歡迎的。

回答

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 

這樣,你留下了只在地圖的鑰匙,你需要返回。

0

我不是很肯定,如果我正確地理解你的問題,但是這是我的想象:

List<String> setCStrings = //your set C strings I guess... 
for(String aSetCString : setCStrings) { 
    String pattern = ".*" + filename + "_" + associatedFileName + ".*"; 
    if(aSetCString.matches(pattern)) { 
     // do what you want with this string that matches the filename and associated file name 
    } 
}