Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

Java | Eclipseのファイル検索機能+正規表現でHashMapをEnumMapに一括置換(命名の前提あり)

パンくず

Java
Eclipseのファイル検索機能でHashMapをEnumMapに一括置換

概要

Eclipseのファイル検索機能でHashMapをEnumMapに一括置換

詳細

Enumをキーとして利用する場合、HashMapよりもEnumMapのほうが高速に機能します。
既存システム上でEnumMapを全く利用していないため、
HashMapをEnumMapに修正したい場合を想定します。

また前提としてEnumのクラスはサフィックスEnumと命名されていることとします。

正規表現

・置換前
※大文字小文字の区別、正規表現のオプションを有効にする

(new[\s]+?)(Hash)(Map[\s]*?<[\s]*?)([^,]+Enum)([\s]*?\,[\s]*?.+[\s]*?>)(\(\))([\s]*?;)

・置換後

\1Enum\3\4\5(\4.class)\7

・各グループ詳細

(new[\s]+?)                  // newからHashの直前まで
(Hash)                       // Hash(Enumに置換する)
(Map[\s]*?<[\s]*?)           // Mapとジェネリック指定の開始の括弧
([^,]+Enum)                  // Mapのキー指定部の任意のEnum
([\s]*?\,[\s]*?.+[\s]*?>)    // Mapのジェネリック指定のカンマと値の指定とジェネリック指定終了の括弧
(\(\))                       // ジェネリック指定後の丸括弧
([\s]*?;)                    // 命令文終了のセミコロン

※[\s]+? 部分は任意の数のスペース、改行等が入る可能性のある箇所。

・補足
ファイル検索で置換したいプロジェクトに対して一括で置換を実行した後は、
importの補足が必要なので一括でimport編成を行えば作業完了です。

サンプル・コード

置換前
package enummapreplace;

import gr.java_conf.tb.java_sample_code.copyutil.HogeEnum;

import java.util.HashMap;
import java.util.Map;

public class Sample1 {
  @SuppressWarnings({ "rawtypes", "unused" })
  public static void main(String[] args) {
    Map<HogeEnum, String> map1 = new HashMap<HogeEnum, String>();
    Map<HogeEnum, String> map2 = new HashMap <HogeEnum, String>();
    Map<HogeEnum, String> map3 =
        new HashMap <HogeEnum, String>();
    Map
    <HogeEnum, String> map5 =
        new HashMap <HogeEnum, String>();
    Map<HogeEnum, String> map6 =
        new HashMap
        <HogeEnum, String>();
    map6 =
        new HashMap
        <HogeEnum, String>();

    Map map90 = new HashMap();
    Map<String, String> map91 = new HashMap<String, String>();
    Map<String, Map<HogeEnum, String>> map92 = new HashMap<String, Map<HogeEnum, String>>();
  }
}
置換後
package enummapreplace;

import gr.java_conf.tb.java_sample_code.copyutil.HogeEnum;

import java.util.HashMap;
import java.util.Map;

public class Sample1 {
  @SuppressWarnings({ "rawtypes", "unused" })
  public static void main(String[] args) {
    Map<HogeEnum, String> map1 = new EnumMap<HogeEnum, String>(HogeEnum.class);
    Map<HogeEnum, String> map2 = new EnumMap <HogeEnum, String>(HogeEnum.class);
    Map<HogeEnum, String> map3 =
        new EnumMap <HogeEnum, String>(HogeEnum.class);
    Map
    <HogeEnum, String> map5 =
        new EnumMap <HogeEnum, String>(HogeEnum.class);
    Map<HogeEnum, String> map6 =
        new EnumMap
        <HogeEnum, String>(HogeEnum.class);
    map6 =
        new EnumMap
        <HogeEnum, String>(HogeEnum.class);

    Map map90 = new HashMap();
    Map<String, String> map91 = new HashMap<String, String>();
    Map<String, Map<HogeEnum, String>> map92 = new HashMap<String, Map<HogeEnum, String>>();
  }
}