Java中的字符串位置解析
我试图找出如何解析一个长字符串,并根据一些索引和长度,以尽可能快的速度将该值转换为特定的数据类型,因为我需要每秒处理大约1000个字符串。说清楚,我需要这样的东西Java中的字符串位置解析,java,string,parsing,Java,String,Parsing,我试图找出如何解析一个长字符串,并根据一些索引和长度,以尽可能快的速度将该值转换为特定的数据类型,因为我需要每秒处理大约1000个字符串。说清楚,我需要这样的东西 String initial = "4239898 mdj 8746bbbrts675420120214"; Someclass parser = new Someclass(initial); Date date = parser.getDate(26,8); 因此,使用从位置26到26+8的子字符串解析日期 所以基本上,我想
String initial = "4239898 mdj 8746bbbrts675420120214";
Someclass parser = new Someclass(initial);
Date date = parser.getDate(26,8);
因此,使用从位置26到26+8的子字符串解析日期
所以基本上,我想知道是否已经有一个类可以帮助我完成这个任务,或者是否有人可以建议一些快速算法
提前谢谢我什么都不知道。我看不出如何比下面更快地完成:
public Date getDate(int start)
{
int year = Integer.parseInt( initial.substring(start, start + 4) );
int month = Integer.parseInt( initial.substring(start + 4, start + 6) );
int day = Integer.parseInt( initial.substring(start + 6, start + 8) );
return new Date(year, month, day);
}
如果所有日期的格式都是YYYYMMDD,那么这可能比使用
SimpleDataFormat
类要快。(注意,在这种情况下,不需要传递长度(8)。字符串文章中有趣的解释
StringBuilder类是在JDK1.5中引入的。这和
StringBuffer类,但StringBuilder不同步
多线程操作。但是,对于单线程程序,
没有同步开销的StringBuilder更容易
效率高
经验法则:如果字符串不被修改,则效率更高
(因为它们在字符串公共池中共享)。然而,如果你
必须经常修改字符串的内容(例如状态
消息),您应该使用StringBuffer类(或StringBuilder)
(如下文所述)取而代之
因此,您可以尝试使用这两个类或默认的String类。决定哪一个最适合你的情况。我有一节课,在非常重的负载系统下大约有300毫秒
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringEfficientParser
{
//String initial = "4239898 mdj 8746bbbrts675420120214";
public static void parseString(String input) throws ParseException
{
StringBuilder sb = new StringBuilder(input);
String input_date = sb.substring(26, 34);
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd");
Date date = sdf.parse(input_date);
}
public static void main(String[] args) throws ParseException
{
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++)
{
parseString("4239898 mdj 8746bbbrts675420120214");
}
long stop = System.currentTimeMillis();
System.out.println("elapsed time : " + (stop - start));
}
}
import java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.Date;
公共类StringEfficientPasser
{
//字符串首字母=“4239898 mdj 8746bbbrts675420120214”;
公共静态void parseString(字符串输入)引发ParseException
{
StringBuilder sb=新的StringBuilder(输入);
字符串输入_date=sb.子字符串(26,34);
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyymmdd”);
Date-Date=sdf.parse(输入_-Date);
}
公共静态void main(字符串[]args)引发异常
{
长启动=System.currentTimeMillis();
对于(int i=0;i<1000;i++)
{
解析字符串(“4239898 mdj 8746bbbrts675420120214”);
}
长时间停止=System.currentTimeMillis();
System.out.println(“运行时间:+(停止-启动));
}
}
我刚刚找到了一个非常酷的“框架”。它被称为fixedformat4j,它完全符合我的要求,而且性能非常快,即使它有点旧
以下是其网站()上的基本示例:
现在可以使用FixedFormatManager加载和导出这个带注释的类
public class BasicUsage {
private static FixedFormatManager manager = new FixedFormatManagerImpl();
public static void main(String[] args) {
String string = "string 001232008-05-29";
BasicRecord record = manager.load(BasicRecord.class, string);
System.out.println("The parsed string: " + record.getStringData());
System.out.println("The parsed integer: " + record.getIntegerData());
System.out.println("The parsed date: " + record.getDateData());
record.setIntegerData(100);
System.out.println("Exported: " + manager.export(record));
}
}
非常感谢您快速的回复。看来老办法是最快的:)谢谢你的回答。StringBuilder似乎真的比String快得多。:)
@Record
public class BasicRecord {
private String stringData;
private Integer integerData;
private Date dateData;
@Field(offset = 1, length = 10)
public String getStringData() {
return stringData;
}
public void setStringData(String stringData) {
this.stringData = stringData;
}
@Field(offset = 11, length = 5, align = Align.RIGHT, paddingChar = '0')
public Integer getIntegerData() {
return integerData;
}
public void setIntegerData(Integer integerData) {
this.integerData = integerData;
}
@Field(offset = 16, length = 10)
@FixedFormatPattern("yyyy-MM-dd")
public Date getDateData() {
return dateData;
}
public void setDateData(Date dateData) {
this.dateData = dateData;
}
}
public class BasicUsage {
private static FixedFormatManager manager = new FixedFormatManagerImpl();
public static void main(String[] args) {
String string = "string 001232008-05-29";
BasicRecord record = manager.load(BasicRecord.class, string);
System.out.println("The parsed string: " + record.getStringData());
System.out.println("The parsed integer: " + record.getIntegerData());
System.out.println("The parsed date: " + record.getDateData());
record.setIntegerData(100);
System.out.println("Exported: " + manager.export(record));
}
}