LoginSignup
4
1

More than 5 years have passed since last update.

Javaでかな大文字⇔小文字変換、濁点・半濁点削除

Last updated at Posted at 2019-04-04
import java.util.HashMap;
import java.util.Map;

public class KanaUtil {
    private static final Map<Character, Character> lower2upperMap = new HashMap<>();
    private static final Map<Character, Character> upper2lowerMap = new HashMap<>();

    private static final String LOWER_CHARS = "ぁぃぅぇぉゃゅょっァィゥェォャュョッァィゥェォャュョッ";
    private static final String UPPER_CHARS = "あいうえおやゆよつアイウエオヤユヨツアイウエオヤユヨツ";
    static {
        char[] lowerChars = LOWER_CHARS.toCharArray();
        char[] upperChars = UPPER_CHARS.toCharArray();
        if (lowerChars.length != upperChars.length) {
            throw new RuntimeException("char count not match. lower=" + lowerChars.length + ", upper=" + upperChars.length);
        }
        for (int i = 0; i < lowerChars.length; i++) {
            lower2upperMap.put(lowerChars[i], upperChars[i]);
            upper2lowerMap.put(upperChars[i], lowerChars[i]);
        }
    }

    public static String toUpperCase(String s) {
        return conv(s, lower2upperMap);
    }

    public static String toLowerCase(String s) {
        return conv(s, upper2lowerMap);
    }

    private static String conv(String s, Map<Character, Character> convMap) {
        StringBuilder sb = new StringBuilder();
        s.chars().mapToObj(c -> (char) c).forEach(c -> {
            Character conv = convMap.get(c);
            if (conv == null) {
                sb.append(c);
            } else {
                sb.append(conv);
            }
        });
        return sb.toString();
    }

    private static final Map<Character, Character> zenDaku2ZenNotDakuMap = new HashMap<>();

    private static final String ZEN_DAKU_CHARS = "ゔがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ";
    private static final String ZEN_NOT_DAKU_CHARS = "うかきくけこさしすせそたちつてとはひふへほはひふへほウカキクケコサシスセソタチツテトハヒフヘホハヒフヘホ";
    static {
        char[] zenDakuChars = ZEN_DAKU_CHARS.toCharArray();
        char[] zenNotDakuChars = ZEN_NOT_DAKU_CHARS.toCharArray();
        if (zenDakuChars.length != zenNotDakuChars.length) {
            throw new RuntimeException("char count not match. zenDaku=" + zenDakuChars.length + ", zenNotDaku=" + zenNotDakuChars.length);
        }
        for (int i = 0; i < zenDakuChars.length; i++) {
            zenDaku2ZenNotDakuMap.put(zenDakuChars[i], zenNotDakuChars[i]);
        }
    }

    public static String removeDakuten(String s) {
        StringBuilder sb = new StringBuilder();
        s.chars().mapToObj(c -> (char) c).forEach(c -> {
            if (c == '゛' || c == '゜' || c == '゙' || c == '゚') {
                // スキップ(削除)
            } else {
                Character conv = zenDaku2ZenNotDakuMap.get(c);
                if (conv == null) {
                    sb.append(c);
                } else {
                    sb.append(conv);
                }
            }
        });
        return sb.toString();
    }
}
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1