Java 有没有一种方法可以搜索一串歌词,然后再将匹配的词组串出来

Java 有没有一种方法可以搜索一串歌词,然后再将匹配的词组串出来,java,string,search,substring,indexof,Java,String,Search,Substring,Indexof,我需要在歌词中搜索匹配的短语 例如: 我有这样的歌词 “她是我所爱的人,我知道她爱你和我。” 给定下面的搜索词,搜索歌词中最接近的匹配项,并计算子字符串中的字符数。我的问题是使用indexOf返回第一个SHE来查找最接近的匹配项。我需要能够子串出匹配的短语 结果应打印出来: 对“她爱我”最接近的匹配搜索是“她爱你和我” 索引长度:20您可以用Java实现自己的复杂算法,因为在JDK中,我们没有现成的适当解决方案。但是在Java世界中有很多合适的解决方案,您可以尝试使用ApacheLucene来

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

例如:

我有这样的歌词

“她是我所爱的人,我知道她爱你和我。”


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

结果应打印出来

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


索引长度:20

您可以用Java实现自己的复杂算法,因为在JDK中,我们没有现成的适当解决方案。但是在Java世界中有很多合适的解决方案,您可以尝试使用ApacheLucene来解决您的问题。

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

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();
    }
}

非常感谢你,这应该让我在我需要做的正确方向!!我添加了一组需要解析的测试歌词,并提出了一个数组越界异常。检查抛出异常的位置(行号),调试代码,并在异常之前检查实际值。如果需要,可以添加任何条件,例如
array.length>0
可能没有任何关键字与歌词匹配。导致(
字符串s:set.get(set.keySet().toArray()[0]).split(“,”){
此行抛出一个
索引自动边界异常
。此行在这里将其打断为(int i=0;i
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,