从java中的HashMap返回通配符匹配列表

我有一个Hashmap,可能在String中包含通配符(*)。

例如,

HashMap students_; 

可以将约翰*作为一把钥匙。 我想知道JohnSmith是否匹配student_中的任何元素。 我的字符串可能有几个匹配(John *,Jo * Smith等)。 有什么方法可以从我的HashMap中获取这些匹配的列表吗?

是否有另一个我可能正在使用的对象,它不需要我遍历我的集合中的每个元素,或者我是否必须将其吸取并使用List对象?

仅供参考,我的collections品中将包含少于200个元素,最终我想找到与最少量通配符匹配的对。

由于散列函数,无法使用hasmap实现。 它必须分配"John*"的散列和"John Smith"等的散列。 相同的价值。

您可以使用TreeMap创建它,如果您编写自己的自定义类WildcardString包装String,并以"John*".compareTo("John Smith")返回0的方式实现compareTo "John*".compareTo("John Smith")您可以使用正则表达式来执行此操作其他答案已经指出。

看到你想要widlcard匹配列表,你可以随时删除条目,并迭代TreeMap.get() 。 记得在完成名称后将钥匙放回去。

这只是实现它的一种可能方式。 使用少于200个元素,你可以很好地迭代。

更新:要在TreeSet上正确强加顺序,您可以区分比较两个WildcardString (意味着它是键之间的比较)和将WildcardStringString (将键与搜索值进行比较)进行比较的情况。

您可以使用正则表达式进行匹配,但必须首先将"John*"转换为正则表达式"John.*" ,尽管您可以即时执行此操作。

以下是一些可行的代码:

 String name = "John Smith"; // For example Map students_ = new HashMap(); for (Map.Entry entry : students_.entrySet()) { // If the entry key is "John*", this code will match if name = "John Smith" if (name.matches("^.*" + entry.getKey().replace("*", ".*") + ".*$")) { // do something with the matching map entry System.out.println("Student " + entry.getValue() + " matched " + entry.getKey()); } } 

您可以迭代Map而不将其转换为列表,并使用String matches函数,wih使用正则表达式。

如果你想避免循环,可以像这样使用番石榴

 @Test public void hashsetContainsWithWildcards() throws Exception { Set students = new HashSet(); students.add("John*"); students.add("Jo*Smith"); students.add("Bill"); Set filteredStudents = Sets.filter(students, new Predicate() { public boolean apply(String string) { return "JohnSmith".matches(string.replace("*", ".*")); } }); assertEquals(2, filteredStudents.size()); assertTrue(filteredStudents.contains("John*")); assertTrue(filteredStudents.contains("Jo*Smith")); 

}