2013-10-01 4 views
3

У меня есть HashMap<Integer,String>. Я попытался следующий код, чтобы запросить карту и вернуть все возможные значенияПоиск с подстановочным знаком в коллекции 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 *» он должен возвращать «тест», «testy». Как его реализовать? Есть ли поиск подстановочных знаков для строки? И я не могу использовать какие-либо внешние библиотеки.

+1

'String' имеет метод' matches'. Вы также можете использовать классы «Pattern» и «Matcher». –

+0

Зачем возвращать null, если список пуст? Было бы разумнее просто вернуть пустой список. – arshajii

+0

Тест assertArrayEquals (новый 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

согласовани "\ ш *" для поиска только в следующих символов: [A-Za-Z_0-9] Если вы хотите найти все символы, использующие * matcher, тогда вы должны попробовать следующее:

queryStr= queryStr.replaceAll("\\*", ".*"); 
Смежные вопросы