Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的字符串位置解析_Java_String_Parsing - Fatal编程技术网

Java中的字符串位置解析

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的子字符串解析日期 所以基本上,我想

我试图找出如何解析一个长字符串,并根据一些索引和长度,以尽可能快的速度将该值转换为特定的数据类型,因为我需要每秒处理大约1000个字符串。说清楚,我需要这样的东西

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));  
  }  
}