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,