2012-02-15 4 views
1

長い文字列を解析する方法を理解しようとしています。インデックスと長さに基づいて、約1000文字列を処理する必要があるため、その値を特定のデータ型にできるだけ速く変換します/秒。明確にするために、私は日付が位置26からJavaでの文字列の位置解析

8 + 26に部分文字列を使用して解析されるので、基本的に、私は助けクラスがすでに存在しているかどうかを知りたいと思い、この

String initial = "4239898 mdj 8746bbbrts675420120214"; 

Someclass parser = new Someclass(initial); 

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

ようなものが必要私はこれを達成するために、または誰かが何らかの高速アルゴリズムを提案できるかどうかを判断する。

ありがとうございます。

+0

を使用してエクスポートすることができ、あなたの偉大かつ迅速いただき、誠にありがとうございます返信それは古い方法が最も速いですそれをするようです:) –

答えて

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の方が効率的です。 です。

Thumbの規則:文字列が変更されていないと、文字列がより効率的になります(文字列共通プールで共有されているため) 。ただし、 という文字列の内容を頻繁に変更する必要がある場合(ステータス など)、StringBufferクラス(または後述のStringBuilder )を使用する必要があります。

これらの2つのクラスまたはデフォルトの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

あなたの答えのためのタク。 StringBuilderはStringよりもはるかに高速です。 :) –

+0

はい、シングルスレッドアプリケーションの場合は、そうする必要があります。 – Jasonw

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