解决方案 »

  1.   

    indexOf("1")  不会查到"12"  和 “21”吧 
      

  2.   


    你现在觉得查不出来是因为 1 在前面    indexof 这个函数 是查询出第一次出现的位置。 如果 我1在最后 那么 就会出现 21
      

  3.   


    你现在觉得查不出来是因为 1 在前面    indexof 这个函数 是查询出第一次出现的位置。 如果 我1在最后 那么 就会出现 21
    public static void main(String aras[]){
    String str ="1,32,44,21,43,12,33";
    String str1 ="21,32,44,1,43,12,33,333";
    System.out.println(str.indexOf('1'));
    System.out.println(str1.indexOf('1'));
    String resultstr = "#"+str1.replaceAll(",", "#")+"#";
    System.out.println(resultstr);
    String queryStr="333";
    System.out.println(resultstr.substring(resultstr.indexOf("#"+queryStr+"#")+1,resultstr.indexOf("#"+queryStr+"#")+queryStr.length()+1));
    }
      

  4.   


    你现在觉得查不出来是因为 1 在前面    indexof 这个函数 是查询出第一次出现的位置。 如果 我1在最后 那么 就会出现 21
    public static void main(String[] args) {
    String str="2,32,44,21,43,12,33";

    System.out.println(str.indexOf("1"));
    }输出结果:9    第一个“1” 出现的位置也是9啊。还有,如果你是想找所有“1”的值,建议不要用indexOf("")去找,就用split,分割成数组之后,在每个用indexOf查找
      

  5.   

    更简单的方法:直接for循环,然后判断~
      

  6.   

    想得复杂了,就用indexOf就行。
    String str ="1,32,44,21,43,12,33";  
    String eq ='1';str=","+str+"," ;
    eq = ","+eq+"," ;str.indexOf(eq);这样就不会查出不想要的啦
      

  7.   

    不错,这也不失一个好方法    不过 这个有一个问题就是  每次做这样的比对时 都需要增加#  查询时  当没有查询到的时候    返回一个  #   在比对的时候  需要再次过滤        就效率而言还 是for快点。
      

  8.   


    因为我是需要去比对  我需要的值   所以那个字符串  可以看做是 一个 json格式  逗号里面就是 一个对象 。
      

  9.   


    因为我是需要去比对  我需要的值   所以那个字符串  可以看做是 一个 json格式  逗号里面就是 一个对象 。你说的我理解,但是相对于本题来说,我还是很纠结~  原谅我技术太菜....不能理解
      

  10.   

    不错,这也不失一个好方法    不过 这个有一个问题就是  每次做这样的比对时 都需要增加#  查询时  当没有查询到的时候    返回一个  #   在比对的时候  需要再次过滤        就效率而言还 是for快点。
    返回#就代表没有,为什么说for效率高?
      

  11.   


    在 mysql 中  find_in_set 这个函数   就是能处理这样的问题 。
    它能够根据 逗号  分别去精准比对 值。而现在java 中  目前来说  我知道的就两种,  indexof + substring   另外就是  split 分割后 再去比对 
    从代码量上来说  都差不错    从效率上来说  用分割 速度快点。  
    所以 我就想 java中 有没  跟 find_in_set 这个函数一样  能精准 比对。
      

  12.   


    恩 mysql的 find_in_set  相对于数据量太大的话,影响性能。 用java实现我目前还没想到好的办法,做的大牛分享!
      

  13.   


    public static void main(String aras[]){
    long startTime=System.nanoTime();
        String str1 ="21,32,44,1,43,12,33,333";
        String resultstr = ","+str1+",";
        System.out.println(resultstr);
        String queryStr="1";
        System.out.println(resultstr.substring(resultstr.indexOf(","+queryStr+",")+1,resultstr.indexOf(","+queryStr+",")+queryStr.length()+1));
        long endTime=System.nanoTime();
        System.out.println("1程序运行时间: "+(endTime-startTime)+"ns"); 
        
        startTime=System.nanoTime();
        String str ="21,32,44,1,43,12,33,333";
        String[] st = str.split(",");
        String eq = "1";
        for(int i =0;i<st.length;i++){
         if(eq.equals(st[i])){
         System.out.println(st[i]);
         break;
         }
        }
        endTime=System.nanoTime();
        System.out.println("2程序运行时间: "+(endTime-startTime)+"ns"); 
    }我知道是代表没有,  我做了 纳秒 时间比对     
    同样的结果 你这个出来的时间是 279277ns
    而 for 是2421435ns 所以
      

  14.   


    public static void main(String aras[]){
    long startTime=System.nanoTime();
        String str1 ="21,32,44,1,43,12,33,333";
        String resultstr = ","+str1+",";
        System.out.println(resultstr);
        String queryStr="1";
        System.out.println(resultstr.substring(resultstr.indexOf(","+queryStr+",")+1,resultstr.indexOf(","+queryStr+",")+queryStr.length()+1));
        long endTime=System.nanoTime();
        System.out.println("1程序运行时间: "+(endTime-startTime)+"ns"); 
        
        startTime=System.nanoTime();
        String str ="21,32,44,1,43,12,33,333";
        String[] st = str.split(",");
        String eq = "1";
        for(int i =0;i<st.length;i++){
         if(eq.equals(st[i])){
         System.out.println(st[i]);
         break;
         }
        }
        endTime=System.nanoTime();
        System.out.println("2程序运行时间: "+(endTime-startTime)+"ns"); 
    }我知道是代表没有,  我做了 纳秒 时间比对     
    同样的结果 你这个出来的时间是 279277ns
    而 for 是2421435ns 所以这个和数据量也有关,每次出来的时间也不一定,不好说
      

  15.   


    如果直接 String resultstr = ","+str1+",";  这样定义  是 比for快 
    如果转义  String resultstr = "#"+str1.replaceAll(",", "#")+"#";  就是for快不过这还是会有一个问题 。就是当查询2个字符以上时  查询不到返回的 就不止 # 一个字符了    查询的字符长度是几 返回的字符下标从0开始 一直到查询字符长度   
    比如 
     String str ="21,32,44,1,43,12,33,333";
    String eq = "111";
    出来的结果 将会是   #21
      

  16.   


    如果直接 String resultstr = ","+str1+",";  这样定义  是 比for快 
    如果转义  String resultstr = "#"+str1.replaceAll(",", "#")+"#";  就是for快不过这还是会有一个问题 。就是当查询2个字符以上时  查询不到返回的 就不止 # 一个字符了    查询的字符长度是几 返回的字符下标从0开始 一直到查询字符长度   
    比如 
     String str ="21,32,44,1,43,12,33,333";
    String eq = "111";
    出来的结果 将会是   #21个人觉得这个结论不一定准确,你说的那个出现#21(可以不用#,我也只是打个比方,就用现成的,也行)
    因为是没有判断就substring了(就是也不论查询的字符串在这个字符串中存不存在)
    if(resultstr.indexOf(","+queryStr+",")!=-1){
    也就是说只有当要查询的字符串在被查询的字符串中存在时,才采取匹配
      

  17.   

    用正则也是可以的(这个思路还是蛮好的),但是这个正则表达式不行,只能匹配第一个是1的字符串
    可以这样
    public static void main(String[] args) {
    // TODO Auto-generated method stub String str="21,32,44,43,12,33,1,333,112";
    //比如查找1
    String regex1="\\b1\\b";
    Pattern p = Pattern.compile(regex1);
    Matcher m = p.matcher(str);
    while(m.find()){
    System.out.println(m.group());
    }

    }
    \\b1\\b
      

  18.   

    用正则也是可以的(这个思路还是蛮好的),但是这个正则表达式不行,只能匹配第一个是1的字符串
    可以这样
    public static void main(String[] args) {
    // TODO Auto-generated method stub String str="21,32,44,43,12,33,1,333,112";
    //比如查找1
    String regex1="\\b1\\b";
    Pattern p = Pattern.compile(regex1);
    Matcher m = p.matcher(str);
    while(m.find()){
    System.out.println(m.group());
    }

    }
    \\b1\\b
    就目前来说   这个是最精准了。    多谢各位~
      

  19.   

    用正则,查找12,就构造^12$|12,|,12,|,12$ 方法比较笨,把各种情况都列举出来了Pattern pattern = Pattern.compile("^12$|12,|,12,|,12$");
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()) {
                System.out.println(matcher.group(0));
            }