2012-03-09 49 views
1

我有點卡在一個項目上.. 基本上,我得到一個目錄來掃描通過某些過濾器的文件。多個鍵和值

命令文件包含帶過濾的行(給定的過濾器名稱存儲在枚舉文件中)指令。像這樣的例子: 後綴%TXT EXEC%是

如果這一切,它會返回一個TXT(擴展)結束所有文件和可執行.. 到目前爲止沒有問題。

問題開始像這樣一行: 後綴%TXT EXEC%YES(在同一行)在這種情況下,它應該返回所有以TXT或可執行結束文件..

我使用String.split(「%」)分割線並將其轉換爲帶有鍵和值的映射,然後遍歷每個鍵並檢查枚舉中的過濾器,並執行期望檢查。

我有點卡在如何識別,當我有超過1每個行的過濾器。 我試着做一個HashMap的第一個過濾器作爲關鍵,值是一個列表,其中包含所有其他(使用分裂(「」)分解過濾器.. 我不能依靠正在偶數或奇數索引,因爲過濾器可能在其末尾有另一個%NOT(後綴%txt%NOT),它將返回所有不以txt結尾的文件...

任何幫助都會!感謝 感謝

回答

2

這個怎麼樣:創建一個Filter接口,並編寫分析文件到基於文件的內容過濾器的功能你會碰到這樣的:

interface Filter { 
    boolean passesFilter(File file); 
} 

class SuffixFilter implements Filter { 
    SuffixFilter(String suffix) { ... } 
    public boolean passesFilter(File file) { 
    // return true if file has the appropriate suffix 
    } 
} 

class ExecutableFilter implements Filter { 
    ... // filter that returns true if the file is executable 
} 

// now for the interesting part ... 
class NegationFilter implements Filter { 
    private final Filter subfilter; 
    NegationFilter(Filter subfilter) { 
    this.subfilter = subfilter; 
    } 

    public boolean passesFilter(File file) { 
    return !subfilter.passesFilter(file); 
    } 
} 

class AndFilter implements Filter { 
    private final Collection<Filter> subfilters; 
    AndFilter(Collection<Filter> subfilters) { 
    this.subfilters = subfilters; 
    } 

    public boolean passesFilter(File file) { 
    for (Filter subfilter : subfilters) { 
     if (!subfilter.passesFilter(file)) { 
     return false; 
     } 
    } 
    return true; 
    } 
} 

class OrFilter implements Filter { 
    private final Collection<Filter> subfilters; 
    OrFilter(Collection<Filter> subfilters) { 
    this.subfilters = subfilters; 
    } 

    public boolean passesFilter(File file) { 
    for (Filter subfilter : subfilters) { 
     if (subfilter.passesFilter(file)) { 
     return true; 
     } 
    } 
    return false; 
    } 
} 

有了這個地方,你只需要建立在同一行中的所有基本的過濾器,然後相鄰單元獲得OrFilter編在一起,同時在不同的行過濾器(或過濾與否)獲得AndFilter版一起。這裏有一個素描:

Filter readAndFilter(Iterable<String> fileLines) { 
    List<Filter> subfilters = new ArrayList<Filter>(); 
    for (String line : fileLines) { 
    subfilters.add(readOrFilter(line)); 
    } 
    return new AndFilter(subfilters); 
} 

Filter readOrFilter(String fileLine) { 
    List<Filter> subfilters = new ArrayList<Filter>(); 
    for (String oneFilter : fileLine.split(" ")) { 
    Filter filter = buildOneFilter(oneFilter); 
    subfilters.add(filter); 
    } 
    return new OrFilter(subfilters); 
} 

Filter buildOneFilter(String oneFilterClause) { 
    // parse as you were doing before 
} 

你會打電話readAndFilter上線從文件中讀出,並返回給你總是一個Filter,你可以將文件傳給它會告訴你他們是否通過過濾。 (注意:如果你願意,你可以特殊處理我的readAndFilterreadOrFilter方法來檢查它們要返回的列表是否長度爲1,如果是這樣,只需返回一個過濾器而不是一個AndOr它不會影響正確性,但它可能會使調試輸出更容易閱讀。)

+0

感謝您長時間的回答,我想我喜歡您嘗試使用的方式,但我仍然有一個很少有不清楚的東西 我還不太確定如何實現它。我得到了一個txt文件,我可以爲它們中的每一個創建一個相應的過濾器對象。但是從這裏開始..如果找到了「(每行超過2個過濾器)」,則創建一個新的OrFilter對象。並在掃描所有行的最後,調用AndFilter對象? 並再次感謝,將試一試 – 2012-03-09 01:33:43

+0

編輯我的答案,勾勒出如何解析文件以生成過濾器。 – jacobm 2012-03-09 03:04:26

+0

謝謝!這主意聽起來很不錯。我會執行這個。 – 2012-03-09 12:21:20