假设有其基于拉丁但有很多的变音符号(一个不起眼的字母返回,可以从给定的字符串中产生的所有的话实际上,字母表我是基于西里尔工作,这就够了混乱本身,所以我决定用一个制作好的拉丁例子去做)。通过添加附加符号
即使设备支持这种语言,输入也不方便(您需要经常切换布局,使用组合键等),所以我想让用户只能使用“普通”字符输入。 Ø信将代表Ø本身,然后ó,ö等
例如,有一个词 “Foobar的”。用户只能输入“foobar”,程序必须返回一些“fóobař”条目的数据。
我做这样的:
public static void main(String[] args) {
HashSet<String> guesses = new HashSet();
String initial = "foobar";
generate(initial, 0, guesses);
System.out.println(guesses);
}
private static void generate(String s, int startFrom, HashSet<String> guesses) {
if (startFrom == s.length() - 1) {
return;
}
guesses.add(s);
for (int i = startFrom; i < s.length(); i++) {
char[] substitutes = getSubstitutes(s.charAt(i));
for (char ch : substitutes) {
String newGuess = replaceCharAt(s, i, ch);
generate(newGuess, i + 1, guesses);
}
}
}
private static char[] getSubstitutes(char ch) {
char[] substitutes;
switch (ch) {
case 'o':
substitutes = new char[] {'ó', 'ö'};
return substitutes;
case 'r':
substitutes = new char[] {'ř'};
return substitutes;
default:
return new char[] {};
}
}
private static String replaceCharAt(String s, int position, char ch) {
return s.substring(0, position) + ch + s.substring(position + 1);
}
也就是说,我递归生成所有可能的替换:
[foóbar, foobař, fóóbar, foobar, foóbař, fööbař, föóbar,
föobař, fööbar, föóbař, fóóbař, fóöbař, föobar, fóobar,
foöbař, foöbar, fóobař, fóöbar]
,然后在多执行数据库查询的WHERE条件
有没有比尝试所有可能的价值更好的方法来做到这一点?编写SQLite函数与REGEXP一起使用会更好吗?
如果你只找到所有组合只是为了配合一些关键字,你应该比较规范它,然后做比较 – sidgate
@ sidgate请你解释正常化位,我不明白。 – Doghouse87