假设存在不定数量且长度不等不规则的字符串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,我就不知道怎么搞了。

解决方案 »

  1.   

    用字符串处理方法:String.subString()\String.indexOf()
    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
      

  2.   

    contains
    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 
      

  3.   

    "key数量庞大,可能超过1k。目前是存储在数据库中"
    这句话比较好,我认为你不应该纯粹从java的算法中去考虑这个问题,因为这样的做法是无论怎么做都很慢,最好的做法就是不要从数据库中获取key数组,而要用src这个字符串数组去数据库中进行搜索,找出符合条件的记录,然后再用ResultSet.getString("")方法获取,你想要的结果
    SQL语句可以是:select * from table where field in ('a','b','c')
    其中'a','b','c'从你的src数组中生成的一个字符串
    对于第二个问题,我等下回复你
      

  4.   

    回答第二个问题:
    其实我觉得第二个问题应该用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;
    }
    }
      

  5.   

    先把数据库里面的东西读到内存里面来吧  反正一K这个东西不是很大  然后就遍历的找吧  在实际情况看看是不是要先把KEY或者SRC排序一下  然后进行2分搜索吧