关于字符串内查找指定值~indexOf除外的 字符串查找 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 indexOf("1") 不会查到"12" 和 “21”吧 你现在觉得查不出来是因为 1 在前面 indexof 这个函数 是查询出第一次出现的位置。 如果 我1在最后 那么 就会出现 21 你现在觉得查不出来是因为 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)); } 你现在觉得查不出来是因为 1 在前面 indexof 这个函数 是查询出第一次出现的位置。 如果 我1在最后 那么 就会出现 21public 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查找 更简单的方法:直接for循环,然后判断~ 想得复杂了,就用indexOf就行。String str ="1,32,44,21,43,12,33"; String eq ='1';str=","+str+"," ;eq = ","+eq+"," ;str.indexOf(eq);这样就不会查出不想要的啦 不错,这也不失一个好方法 不过 这个有一个问题就是 每次做这样的比对时 都需要增加# 查询时 当没有查询到的时候 返回一个 # 在比对的时候 需要再次过滤 就效率而言还 是for快点。 因为我是需要去比对 我需要的值 所以那个字符串 可以看做是 一个 json格式 逗号里面就是 一个对象 。 因为我是需要去比对 我需要的值 所以那个字符串 可以看做是 一个 json格式 逗号里面就是 一个对象 。你说的我理解,但是相对于本题来说,我还是很纠结~ 原谅我技术太菜....不能理解 不错,这也不失一个好方法 不过 这个有一个问题就是 每次做这样的比对时 都需要增加# 查询时 当没有查询到的时候 返回一个 # 在比对的时候 需要再次过滤 就效率而言还 是for快点。返回#就代表没有,为什么说for效率高? 在 mysql 中 find_in_set 这个函数 就是能处理这样的问题 。它能够根据 逗号 分别去精准比对 值。而现在java 中 目前来说 我知道的就两种, indexof + substring 另外就是 split 分割后 再去比对 从代码量上来说 都差不错 从效率上来说 用分割 速度快点。 所以 我就想 java中 有没 跟 find_in_set 这个函数一样 能精准 比对。 恩 mysql的 find_in_set 相对于数据量太大的话,影响性能。 用java实现我目前还没想到好的办法,做的大牛分享! 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 所以 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 所以这个和数据量也有关,每次出来的时间也不一定,不好说 如果直接 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 如果直接 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){也就是说只有当要查询的字符串在被查询的字符串中存在时,才采取匹配 用正则也是可以的(这个思路还是蛮好的),但是这个正则表达式不行,只能匹配第一个是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 用正则也是可以的(这个思路还是蛮好的),但是这个正则表达式不行,只能匹配第一个是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就目前来说 这个是最精准了。 多谢各位~ 用正则,查找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)); } 3Des加密问题 ibatis 中 时间怎么得到 啊 线程的困惑 struts问题 100 分! 关于weblogic7 中配置 log4j 紧急~~关于守护进程的问题~~~~ tabPanel嵌套内部panel 内部按钮再调用外部tabPanel 无法显示 SSH 乱码问题 请问一般的jsp 服务器会支持socket吗? 学习EJB的困惑 问个难题:如果当前时间超过了数据库表中的时间字段,则触发事件 Could not open Hibernate Session for transaction; nested exception is org.hibern
你现在觉得查不出来是因为 1 在前面 indexof 这个函数 是查询出第一次出现的位置。 如果 我1在最后 那么 就会出现 21
你现在觉得查不出来是因为 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));
}
你现在觉得查不出来是因为 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查找
String str ="1,32,44,21,43,12,33";
String eq ='1';str=","+str+"," ;
eq = ","+eq+"," ;str.indexOf(eq);这样就不会查出不想要的啦
因为我是需要去比对 我需要的值 所以那个字符串 可以看做是 一个 json格式 逗号里面就是 一个对象 。
因为我是需要去比对 我需要的值 所以那个字符串 可以看做是 一个 json格式 逗号里面就是 一个对象 。你说的我理解,但是相对于本题来说,我还是很纠结~ 原谅我技术太菜....不能理解
返回#就代表没有,为什么说for效率高?
在 mysql 中 find_in_set 这个函数 就是能处理这样的问题 。
它能够根据 逗号 分别去精准比对 值。而现在java 中 目前来说 我知道的就两种, indexof + substring 另外就是 split 分割后 再去比对
从代码量上来说 都差不错 从效率上来说 用分割 速度快点。
所以 我就想 java中 有没 跟 find_in_set 这个函数一样 能精准 比对。
恩 mysql的 find_in_set 相对于数据量太大的话,影响性能。 用java实现我目前还没想到好的办法,做的大牛分享!
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 所以
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 所以这个和数据量也有关,每次出来的时间也不一定,不好说
如果直接 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
如果直接 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){
也就是说只有当要查询的字符串在被查询的字符串中存在时,才采取匹配
可以这样
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
可以这样
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
就目前来说 这个是最精准了。 多谢各位~
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
System.out.println(matcher.group(0));
}