java - 有没有一种方法可以搜索一串歌词,然后将匹配的短语子串出来

标签 java string search substring indexof

我需要在歌词中搜索匹配的短语。

例如:

我有这样的歌词。

是我的那个,我知道它是什么东西什么东西什么东西她爱你和 某事某事某事。”


给定下面的搜索词,搜索最接近匹配的歌词并计算子字符串中的字符数。我的问题是使用 indexOf 找到最接近的匹配返回第一个 SHE。我需要能够子串出结束匹配的短语。

结果应该打印出来:

“她爱我”最接近的匹配搜索是“她爱你和我”。

索引长度:20

最佳答案

我知道它不是最优化或最有效的。但是,以下代码适用于大多数关键字。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class KeywordSearch {

    public static void main(String[] args) {
        System.out.println(getMatchingLyrics("She is the one that I love, "
                + "I know it something something something something something "
                + "she loves you and me something something something.", 
                Arrays.asList("she you".toLowerCase().split(" "))));
    }

    private static String getMatchingLyrics(String lyrics, List<String> keywords) {
        String[] lyricWords = lyrics.split(" ");

        // Split and get the word index for keyword matches
        Map<Integer, String> lyricEngine = new TreeMap<>();
        for(int i = 0; i < lyricWords.length; i++) {
            String search = lyricWords[i].toLowerCase().replaceAll("[^a-zA-Z0-9]", "");
            if (keywords.contains(search) && !lyricEngine.values().contains(lyricWords[i])) {
                lyricEngine.put(i, lyricWords[i]);
            }
        }

        Integer min = null;
        Integer max = null;
        if (lyricEngine.size() == 1) {
            return lyricEngine.values().iterator().next();
        } else if (lyricEngine.size() <= keywords.size()) {
            List<Integer> coll = new ArrayList<>(lyricEngine.keySet());
            min = coll.get(0);
            max = coll.get(lyricEngine.size() - 1);
        } else {
            // Prepare the difference between the indexes
            Map<Integer, String> set = new TreeMap<>(); 
            List<Integer> keys = new ArrayList<>(lyricEngine.keySet());
            for(int i=0; i <= lyricEngine.size() - keywords.size(); i++) {
                int j = i + keywords.size() - 1;
                int diff = keys.get(j);
                StringBuilder str = new StringBuilder(keys.get(j) + "");
                for (j = j - 1; j >= i; j--) {
                    diff -= keys.get(j);
                    str.append(',');
                    str.append(keys.get(j));
                }
                set.put(diff, str.toString());
            }

            // Get the value with minimum difference
            for(String s:set.get(set.keySet().toArray()[0]).split(",")) {
                int x = Integer.parseInt(s);
                if (min == null && max == null) {
                    max = x;
                    min = x;
                } else {
                    if (x > max) {
                        max = x;
                    } else if (x < min) {
                        min = x;
                    }
                }
            }
        }

        // Build the string from indexes
        StringBuilder s = new StringBuilder();
        for (int i = min; i <= max; i++) {
            s.append(lyricWords[i]);
            if (i < max) {
                s.append(" ");
            }
        }
        return s.toString();
    }
}

您可以根据需要构建和优化它。解释作为评论给出。如果您有任何疑问,请随时在 DM 或评论中询问我。

针对不同的关键词,

Keyword: she loves me
Output: she loves you and me

Keyword: I love it
Output: I love, I know it

Keyword: she is one love
Output: She is the one that I love,

关于java - 有没有一种方法可以搜索一串歌词,然后将匹配的短语子串出来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633239/

相关文章:

search - 在大型词典上支持通配符搜索的最佳方式?

java - Eclipse插件必须用Java编写吗?

javascript - 如何将逗号分隔的字符串转换为数组?

java - 数组越界异常

Java:如何从字符串中获取 Iterator<Character>

python - 如何将变量错误添加到正则表达式模糊搜索中。 Python

java - Java HashSet分区中如何选择唯一代表

java.lang.NoClassDefFoundError : org. tigris.subversion.svnclientadapter.SVNClientAdapterFactory

java - FileWriter 和 jar 文件 - 找不到资源

java - Java中的二进制搜索