文字列変換の問題


昨日問題がありました。「2015,10,14,18,03,01」のような大量の時間書式文字列を、指定された形式の文字列に変換します。
  • 方法1,
  • SimpleDateFormat timeShareSdf = new SimpleDateFormat("yyyy,MM,dd,HH,mm,ss");
    SimpleDateFormat formatDateTimeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    for(String i : data){
        String t = formatDateTimeSdf.format(timeShareSdf.parse(i));
    }
    多くの人がプログラムを書く人が自然に思いつく方法ですが、これは大データ量の変換には一番遅いです。
  • 方法二
  • String regex= "(\\d{4}),(\\d{2}),(\\d{2}),(\\d{2}),(\\d{2}),(\\d{2})";
    for(String i : data){
        String t = i.replaceFirst(regex, "$1-$2-$3 $4:$5:$6");
    }
    正規表現を使うと、高い感じがします。効率はもちろん高いです。でも、初級の使い方です。
  • 方法3,
  • String regex= "(\\d{4}),(\\d{2}),(\\d{2}),(\\d{2}),(\\d{2}),(\\d{2})";
    Pattern p = Pattern.compile(regex);
    for(String i : data){
        Matcher matcher = p.matcher(i);
        StringBuffer sb = new StringBuffer();
        if(matcher.find()){
           String t = sb.append(matcher.group(1))
                .append("-").append(matcher.group(3))
                .append(" ").append(matcher.group(4))
                .append(":").append(matcher.group(6))
                .toString();
        }
    }
    同じ正規表現でも、これは前のものより効果的です。
  • 方法4,
  • for(String i : data){
        String[] item = i.split(",");
        StringBuffer sb = new StringBuffer();
        String t = sb.append(item[0]).append("-")
                .append(item[2]).append(" ")                  
                .append(item[3]).append(":")
                .append(item[4]).append(":")
                .append(item[5]).toString();
    }
    この場合、この方法は方法3よりもずっと早いことが意外に分かりました。
  • 方法5,
  • public String replaceStr(String orignStr, char[] targetArray, char[] replaceArray){
        int count = 0;
        if(orignStr == null){
            return null;
        }
        char[] cs = orignStr.toCharArray();
    
        for(int i = 0; i < cs.length; i++){
            if(cs[i] == targetArray[count]){
                cs[i] = replaceArray[count];
                if(count == targetArray.length - 1){
                    break;
                }else{
                    count++;
                }
            }
        }
        return new String(cs);
    }
    char[] r1 = {',',',',',',',',','};
    char[] r2 = {'-','-',' ',':',':'};
    for(String i : data){ String t= replaceStr(i, r1, r2); }
    最も効率的な方法は、文字配列から着手して、方法の4倍より何倍も速くなります。もちろんこの場合に対してです。
    総括:実は私達がプログラミングする時、慣性の思惟があって、問題に出会うのはよく習慣の考えで解決して、普通の情況の下で問題がないので、特殊な情況の下でだけあって、もっと高い効率の解決方法を得たくて、やはり問題の根源から思考に行きます。
    著作権声明:本文はブロガーのオリジナル文章で、ブロガーの許可なしに転載してはいけません。