从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
(意味着它是键之间的比较)和将WildcardString
与String
(将键与搜索值进行比较)进行比较的情况。
您可以使用正则表达式进行匹配,但必须首先将"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"));
}