首页 > 解决方案 > 按分隔的字母搜索词过滤列表

问题描述

我有某种列表,例如下面的示例,其中包含 (Car & Racoon) 单词。如果我想搜索“c r”,我希望它返回“Car”而不是“Racoon”。以下是我目前的方法,但它不考虑字母顺序并返回我“浣熊”。对于任何以空格分隔的搜索词/字母,我想要一个尽可能灵活的解决方案。

String[] words_list = {"Car", "Racoon"};
    String search_input = "c r";

    String[] input_parts = search_input.trim().toLowerCase().split(" ");

    for (String word : words_list){
        int matches= 0;
        for (String letter : input_parts) {
            if (word.toLowerCase().contains(letter)) {
                ++matches;
            }
        }

        if (matches == input_parts.length) {
            Log.d("Result : ", word);
        }
    }

标签: javaandroidarrayssearch

解决方案


这是正则表达式的一个很好的用例。尝试这样的事情:

    String[] wordsList = {"Car", "Racoon"};
    String searchInput = "c r";

    String searchRegEx = searchInput.replace(" ", ".{1}");
    Pattern pattern = Pattern.compile(searchRegEx, Pattern.CASE_INSENSITIVE);
    System.out.println("RegEx (case-insensitive) is: " + searchRegEx);

    for (String word : wordsList){
        Matcher matcher = pattern.matcher(word);
        boolean match = matcher.matches();
        System.out.println("Test word '"+word + "' and match was: " + match);
    }

如您所见,我找到了每个空格并将其替换为.{1}这意味着任何字符的一个实例。如果你想开放匹配一个或多个字符,你可以使用类似的东西.+。或者,您可以更具体地指定只匹配大小写字符 az:[a-zA-Z]{1}[a-zA-Z]+. 这Pattern.CASE_INSENSTIVE很重要,因为否则您的单词列表具有大写字母CCar与小写输入不匹配。

在这种情况下,编译 Pattern 是一个重要的优化。如您所知,RegEx 可能很慢,如果您在 for 循环中内联它,它将为每个测试编译您的正则表达式,这将是缓慢且低效的。


推荐阅读