假设存在不定数量且长度不等不规则的字符串n个,举例如下:
String[] src={"a","b","c",....,"nnnn"...};另有感兴趣的不定数量且长度不等不规则的字符串n个,举例如下:
String[] key={"u","v","w","x","y","z",......};src的数量基本在10个左右,key数量庞大,可能超过1k。目前是存储在数据库中。希望能从src中按照以下规则找到key1.只找到感兴趣的单个字符串,比如,从src中找到了y2.找到字符串的感兴趣的特定组合,比如,x,z必须同时出现在src中才有意义,如果同时找到x,y就没有意义。
对于1,我现在的做法是遍历src的每一个串,看看是不是在key里面有。
但是2,我就不知道怎么搞了。
String[] src={"a","b","c",....,"nnnn"...};另有感兴趣的不定数量且长度不等不规则的字符串n个,举例如下:
String[] key={"u","v","w","x","y","z",......};src的数量基本在10个左右,key数量庞大,可能超过1k。目前是存储在数据库中。希望能从src中按照以下规则找到key1.只找到感兴趣的单个字符串,比如,从src中找到了y2.找到字符串的感兴趣的特定组合,比如,x,z必须同时出现在src中才有意义,如果同时找到x,y就没有意义。
对于1,我现在的做法是遍历src的每一个串,看看是不是在key里面有。
但是2,我就不知道怎么搞了。
1.把你的数组 组织成一个字符串;如:a = "abcdefghijklmn"
2.找到感兴趣的字符串组合的位置 如:b = "cd"
int pos = a.indexOf(b);
3.获取字符串组合,判断它是否存在
string temp = a.subString(pos,pos+b.length); //这里的意思是pos是字符串的开始index,pos+b.length是结束index,如果有误差,可以调一下。
//再判断这个字符串是否有效
if (temp.equals(b)){
//ok
}
else
// no OK
public boolean contains(CharSequence s)
Returns true if and only if this string contains the specified sequence of char values. Parameters:
s - the sequence to search for
Returns:
true if this string contains s, false otherwise
这句话比较好,我认为你不应该纯粹从java的算法中去考虑这个问题,因为这样的做法是无论怎么做都很慢,最好的做法就是不要从数据库中获取key数组,而要用src这个字符串数组去数据库中进行搜索,找出符合条件的记录,然后再用ResultSet.getString("")方法获取,你想要的结果
SQL语句可以是:select * from table where field in ('a','b','c')
其中'a','b','c'从你的src数组中生成的一个字符串
对于第二个问题,我等下回复你
其实我觉得第二个问题应该用StringBuffer来解决比较好,因为速度比较快,而且条件比较容易实现我的做法跟“lllllllllluoyi(罗毅)”有点象,就是先把src数组合并成一个字符串,但是要加上分隔符,不然容易判断错误,比如想要找到"bin",但是如果里面有"binary"那就很可能判断错误了。
先将bin两头加上一个特殊的字符,比如是"|",最后数组合并成"|a|b|c|aa|rr|ee|"的形式,这个时候找bin的时候,不要去直接找bin,找|bin|比较好,这样不会出现出界的问题。下面是我写的一个类,你可以用Checker.checkExist(new String[]{"dd","aa","ss"},new String[] {"dd","ss"});class Checker
{
public static boolean checkExist(String[] src,String[] key)
{
//src表示被查找的字符串数组
//key表示同时出现的字符串数组
//返回值是在src中是否同时存在key中出现的字符串
if((src.length|key.length)==0)
return false;
StringBuffer sb=new StringBuffer("|");
for(int i=0;i<src.length;i++)
sb.append(src[i]+"|");
for(i=0;i<key.length;i++)
if(sb.indexOf("|"+key[i]+"|")<0)return false;
return true;
}
}