如何使用部分字符串

时间:2015-11-20 06:43:57

标签: java dictionary hashmap contains

我正在开发一个程序来验证地图是否包含一些值。 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 ,这稍微快一点。 String.class file from JAVA7

See this question

这将返回所需的结果:

this.userId

但是,我只想知道,还有其他方法可以验证相同吗?

4 个答案:

答案 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是最大字符串长度)查找性能。