我正在开发一个程序来验证地图是否包含一些值。 Map
API有一个名为map.containsValue(string)
的方法。但是,此方法验证完整的String作为值。
import java.util.HashMap;
import java.util.Map;
public class TestMap {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(6, "P_T");
map.put(7, "P_Q_T");
map.put(8, "T");
map.put(9, "A");
map.put(10, "B");
map.put(11, "P_A");
map.put(1, "P_1");
map.put(2, "Q");
map.put(3, "P_Q");
map.put(4, "Q_T");
map.put(5, "T");
System.out.println("Map is = "+map);
System.out.println("Result is = " + map.containsValue("P"));
}
}
以上程序将输出返回:
Map is = {1=P_1, 2=Q, 3=P_Q, 4=Q_T, 5=T, 6=P_T, 7=P_Q_T, 8=T, 9=A, 10=B, 11=P_A}
Result is = false
我的要求是Result
应为true,因为Map包含键1,3,6,7,11,其中包含char P
作为值。
我有一个解决方案,我可以使用循环来验证每个值,然后找到indexOf
P
个字符的每个值import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestMap {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(6, "P_T");
map.put(7, "P_Q_T");
map.put(8, "T");
map.put(9, "A");
map.put(10, "B");
map.put(11, "P_A");
map.put(1, "P_1");
map.put(2, "Q");
map.put(3, "P_Q");
map.put(4, "Q_T");
map.put(5, "T");
System.out.println("Map is = " + map);
System.out.println("Result is = " + map.containsValue("P"));
System.out.println("Result from loop is = " + verifyMap(map));
}
private static boolean verifyMap(Map<Integer, String> map) {
// TODO Auto-generated method stub
Set<Integer> set = map.keySet();
Iterator<Integer> itr = set.iterator();
while (itr.hasNext()) {
Integer integer = (Integer) itr.next();
String str = map.get(integer);
if (str.indexOf("P") >= 0)
return true;
}
return false;
}
}
。
string
我使用indexOf
方法评估了contains
而不是Result from loop is = true
,这稍微快一点。
这将返回所需的结果:
this.userId
但是,我只想知道,还有其他方法可以验证相同吗?
答案 0 :(得分:5)
您可以使用Java 8 Streams用更少的代码编写方法:
private static boolean verifyMap(Map<Integer, String> map) {
return map.values().stream().anyMatch(str->str.indexOf("P") >= 0);
}
即使在Java 7中,您的方法也可以更短:
private static boolean verifyMap(Map<Integer, String> map) {
for (String str : map.values()) {
if (str.indexOf("P") >= 0)
return true;
}
return false;
}
答案 1 :(得分:0)
你也可以试试这个:
private static boolean verifyMap(Map<Integer, String> map) {
for(String val:map.values())
{
if( val.contains("P"))
{
return true;
}
}
return false;
}
答案 2 :(得分:0)
我能够找到一种方法来验证map值中的部分char。
我使用了Java-7中的Matcher
API。感谢@Eran,提供与Java8相关的提示。
以下是我正在使用的代码段。
private static boolean verifyMap(Map<Integer, String> map) {
Matcher matcher = Pattern.compile(".*p.*", Pattern.CASE_INSENSITIVE)
.matcher(map.values().toString());
return matcher.matches();
}
答案 3 :(得分:0)
为什么要首先搜索哈希表的值?这保证至少是O(N)(并且如你在其他地方所建议的那样将整个事物串联起来甚至更糟,因为它还需要额外的O(N)分配和大的常数因子)。你想要的是构建一个向后映射的inverted index(从字符串到整数)。您最有可能想要使用trie,这将为您提供O(M)(其中M是最大字符串长度)查找性能。