2013-10-01 73 views
3

我有HashMap<Integer,String>。我嘗試下面的代碼來查詢地圖和返回所有可能的值用字符串集合中的通配符搜索

public Collection<String> query(String queryStr) { 
     List<String> list = new ArrayList<String>(); 
    for (Map.Entry<String, Integer> entry : myMap.entrySet()) { 
     if (queryStr.matches(entry.getKey())) 
      list.add(entry.getKey()); 
    } 
    if (list.isEmpty()) 
     return null; 
    else 
     return list; 
} 

如果地圖有"test","best","crest","zest","testy","tether","temper","teat","tempest"。查詢te*t應返回"teat","tempest","test"。對於'test *',它應該返回「test」,「testy」。如何實現它?是否有任何通配符搜索字符串?我不能使用任何外部庫。

+1

'字符串'''方法'匹配'。你也可以使用'Pattern'和'Matcher'類。 –

+0

如果列表爲空,爲什麼返回null?返回一個空列表會更有意義。 – arshajii

+0

assertArrayEquals(new Object [] {「best」,「crest」,「tempest」,「test」,「zest」},getSortedArray(dict.query(「* est」)));沒有返回任何東西。 – NEO

回答

6
String queryStr="te*t"; 

queryStr= queryStr.replaceAll("\\*", "\\\\w*"); 

System.out.println(query(queryStr)); 

完整的程序

public class sample { 

    static List<String> values = Arrays.asList("test","best","crest","zest","testy","tether","temper","teat","tempest"); 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String queryStr="te*t"; 
     queryStr= queryStr.replaceAll("\\*", "\\\\w*"); 
     System.out.println(queryStr); 
     System.out.println(query(queryStr)); 

    } 

    public static Collection<String> query(String queryStr) { 
     List<String> list = new ArrayList<String>(); 
    for (String str : values) { 
     if (str.matches(queryStr)) 
      list.add(str); 
    } 
    if (list.isEmpty()) 
     return null; 
    else 
     return list; 
} 

} 
1

的匹配 「\ W *」 查找只有以下字符:[A-ZA-Z_0-9] 如果你想搜索所有字符使用*匹配,那麼你應該試試這個:

queryStr= queryStr.replaceAll("\\*", ".*");