【问题标题】:Filter a list by a separated letters search term按分隔的字母搜索词过滤列表
【发布时间】:2018-10-28 23:38:29
【问题描述】:

我有一些类似于下面示例的列表,其中包含 (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);
        }
    }

【问题讨论】:

    标签: java android arrays search


    【解决方案1】:

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

        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},这意味着任何字符的实例都只有一次。如果您想开放匹配一个或多个字符,则可以改用.+ 之类的东西。或者您可以更具体地指定只匹配字符 a-z 大写和小写:[a-zA-Z]{1}[a-zA-Z]+Pattern.CASE_INSENSTIVE 很重要,否则您的单词列表中的 C 大写 Car 将与小写输入不匹配。

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

    【讨论】:

    • 谢谢!这正是我一直在寻找的。还有一个问题,因为我对正则表达式没有经验。我已经使用了“.+”,因为它更适合我的需要,但是如果我想将“停车场”之类的句子与“C.+ in”之类的正则表达式匹配怎么办?我怎样才能让它也返回 true ?每当它们位于单词列表中时,如何使空格分隔的搜索词返回 true ?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多