2012-02-15 72 views
1

我想弄清楚如何解析一个长字符串,并根据一些索引和长度,获取该值转换为一个特定的数据类型尽可能最快,因为我需要处理大约1000个字符串/第二。需要明确的是,我需要的是这样的在Java中的字符串位置解析

String initial = "4239898 mdj 8746bbbrts675420120214"; 

Someclass parser = new Someclass(initial); 

Date date = parser.getDate(26,8); 

所以日期是使用子从位置解析26到26 + 8

所以基本上,我想知道是否有已经一类帮助我做到这一点,或者如果任何人可以建议一些快速算法。

在此先感谢

+0

非常感谢你为你的伟大和快速回复。它似乎这样做,旧的方式是最快的:) – 2012-02-15 19:46:54

回答

0

没有什么我知道的。我不知道如何做到这一点比下面更快:

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,这可能比使用SimpleDateFormat类更快。 (请注意,在这种情况下,您不需要传递长度(8))。

0

this字符串文章有趣的解释

StringBuilder类在JDK 1.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)); 
    } 

} 
+0

Thak为您的答案。看来StringBuilder实际上比String快。 :) – 2012-02-15 19:49:45

+0

是的,对于单线程应用程序,它应该是。 – Jasonw 2012-02-16 01:16:41

1
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.text.ParseException; 
import java.util.Date; 

public class SomeClass { 
    public static void main(String []args) { 
     String initial = "4239898 mdj 8746bbbrts675420120214"; 

     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     Date parsed = new Date(); 

     try { 
      parsed = format.parse(initial.substring(26,34)); 
     } 
     catch(ParseException pe) { 
      pe.printStackTrace(); 
     } 

     System.out.println(parsed); 
    } 
} 
1

我刚刚发现我的目的一个很酷的“框架”。这就是所谓的fixedformat4j,它完全符合我的要求,即使它有点老,性能也非常快。

这里的(http://fixedformat4j.ancientprogramming.com/)在其网站上找到了基本的例子:

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

这个注解类,现在可以加载并使用FixedFormatManager

导出的
public class BasicUsage { 

    private static FixedFormatManager manager = new FixedFormatManagerImpl(); 

    public static void main(String[] args) { 
    String string = "string 0-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)); 
    } 
}