2012-02-15 26 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)); 
    } 
}