字符串分析效率,求助!

tyxsoft 2007-12-06 01:11:19
有大约10000000(一千万)个类似这样的长字符串

CREATED BettingOffer[448359642]{odds="2.12",oddsStatusId="1",oddsChangedDate="2007-11-19 00:00:00.458",outcomeId="23756563",isBack="true",isSingle="true",isLive="false",volume=null,volumeCurrencyId=null,couponKey=null,providerId="3000343"}

现在需要提取出其中的4个属性,如outcomeId的23756563、isBack的true、isSingle的true、providerId的3000343,组成短串后,
拼接成 23756563&3000343&truetrue@...(后面雷同)的长串

请问怎么样提取短串效率最高,请大家各抒己见,谢谢!

...全文
161 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Clesome_VC 2007-12-06
  • 打赏
  • 举报
回复
re LZ
应该没有更好的方法了 用正则确实效率比较低
aqy_19781228 2007-12-06
  • 打赏
  • 举报
回复
ding

不推荐用正则表达式,这样太慢。

如果outcomeId这样的关键字相对还比较固定的话,建议substring()方法找找。
不懂编程 2007-12-06
  • 打赏
  • 举报
回复
study
tyxsoft 2007-12-06
  • 打赏
  • 举报
回复
to: luffyday

这样是能做出来,但恐怕太慢了 :)
luffyday 2007-12-06
  • 打赏
  • 举报
回复
public static void main(String[] args) {
String str = "a= '1 ',b= '2 ',c= '3 ',d= '4 ' ";

str.replace( "= ' ", "/");
str.replace( " ', ", "/ ");

//这时str变成了 "a/1/b/2/c/3/d/4 "

String st[] = str.split( "/ ");
Map<String,String> map = new HashMap<String,String>();

for(int i=0;i <st.length;i++){
map.put(st[i], st[i+1]);
}

//这时你想要什么 直接去map拿就OK了啊~~
System.out.println(map.get("a"));
System.out.println(map.get("b"));
System.out.println(map.get("c"));
}
tyxsoft 2007-12-06
  • 打赏
  • 举报
回复
to: Clesome_VC

假设我现在拼接出了像

23756563&3000343&truetrue@23756564&3000343&truetrue@23756563&3000343&truefalse@....(500万个短串)

这样的长串,保存在StringBuilder中。
需要知道 "23756583&3000343&truetrue@" 有没有在长串中出现过,有没有比 StringBuilder.indexOf()更有效率的方法?
luffyday 2007-12-06
  • 打赏
  • 举报
回复
那就用我的方法啦~~
tyxsoft 2007-12-06
  • 打赏
  • 举报
回复
to: AndyJee
是有规律,但固定位置截取恐怕不行,因为某些字段属性的长度还是可能变化的,比如 odds="3.1" 和 odds="3.25" 占用的位数不同,就会影响到后面的截取
jinxfei 2007-12-06
  • 打赏
  • 举报
回复
我建议不要用java,如果是unix/linux环境,使用Awk
AndyJee 2007-12-06
  • 打赏
  • 举报
回复
如果要提高效率的话,个人感觉还是不要用正则表达式。虽然它的却很好用,但那是牺牲了效率换取通用性的做法。

LZ你的字符串是不是都像上述字符串那样有规律?我想应该是的。这样的话,你可以利用字符串的位置固定特性搜索,会很快。而且正确、好写代码。

IO操作效率惠降低很多很多,如果仅在内存中操作就不会慢了。

就用搜索字符串位置、截取字符串、拼接字符串的方法。

由于此类工作划分极其容易,截串可以考虑多机器并行(如果数据量在夸张些)。

你要把那么大的结果字符串放在哪?
如果是文件的话,建议分多台机器分别处理一下部分,手动合成一个文件最好!

注意:一定要把所有字符串都在内存拼接好了以后再统一输出到文件,用StringBuffer!
Clesome_VC 2007-12-06
  • 打赏
  • 举报
回复
好像最后个该删去“&”
matcher.group(2) + "&" + matcher.group(3)+"@");
改为
matcher.group(2) + matcher.group(3)+"@");

不好意思
luffyday 2007-12-06
  • 打赏
  • 举报
回复
String str = "a='1',b='2',c='3',d='4'";


str.replace("='","");
str.replace("',","/");

这是str变成 "a1/b2/c3/d4"

String st[] = str.split("/");

for(int i=0;i<st.length;i++){
搜索吧~
System.out.println(str.substring(str.indexOf('a')+1));
System.out.println(str.substring(str.indexOf('b')+1));
System.out.println(str.substring(str.indexOf('c')+1));
}


估计效率不高~
Clesome_VC 2007-12-06
  • 打赏
  • 举报
回复
使用正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegex3 {

public static void main(String[] args) {
String str = "CREATED BettingOffer[448359642]{odds=\"2.12\","
+ "oddsStatusId=\"1\",oddsChangedDate=\"2007-11-19 00:00:00.458\","
+ "outcomeId=\"23756563\",isBack=\"true\",isSingle=\"true\","
+ "isLive=\"false\",volume=null,volumeCurrencyId=null,"
+ "couponKey=null,providerId=\"3000343\"} ";
String regex = "\\{.*outcomeId=\"(\\d+)\".*isBack=\"(true|false)\".*isSingle=\"(true|false)\".*providerId=\"(\\d+)\"\\}";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if(matcher.find())
System.out.println(matcher.group(1) + "&" + matcher.group(4)
+ "&" + matcher.group(2) + "&" + matcher.group(3)+"@");
}

}

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧