Alphabet.java

package cn.denghanxi.s51;

import java.util.ArrayList;
import java.util.List;

/**
 * 字母表
 */
public class Alphabet {

    private List<Character> chars = new ArrayList<>();

    /**
     * 根据s中的字符构造字符表
     *
     * @param s 字符串
     */
    public Alphabet(String s) {
        char[] charArray = s.toCharArray();
        for (char c : charArray) {
            if (!chars.contains(c)) {
                chars.add(c);
            }
        }
    }

    /**
     * 获取字符表中索引位置的字符
     *
     * @param index 索引位置
     * @return 字符
     */
    public char toChar(int index) {
        return chars.get(index);
    }

    /**
     * 获取c的索引,在 0 到 R-1 之间
     *
     * @param c 字符c
     * @return 索引位置
     */
    public int toIndex(char c) {
        return chars.indexOf(c);
    }

    /**
     * 是否包含字符c
     *
     * @param c 字符c
     * @return 是否在字母表中
     */
    public boolean contains(char c) {
        return chars.contains(c);
    }

    /**
     * 基数-字母表中的字符数量
     * /
     * @return 基数
     */
    public int r() {
        return chars.size();
    }

    /**
     * 一个索引所需要的比特数
     *
     * @return 比特数
     */
    public int lgR() {
        return Double.valueOf(Math.ceil(Math.log(r()) / Math.log(2))).intValue();
    }

    /**
     * 将s转换为R进制的整数
     *
     * @param s s
     * @return 整数数组
     */
    public int[] toIndices(String s) {
        int[] result = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            result[i] = toIndex(s.charAt(i));
        }
        return result;
    }

    /**
     * 将R进制的整数转换为基于该字母表的字符串
     *
     * @param indices 整数数组
     * @return 字符串
     */
    public String toChars(int[] indices) {
        char[] chars = new char[indices.length];
        for (int i = 0; i < indices.length; i++) {
            chars[i] = toChar(indices[i]);
        }

        return new String(chars);
    }

}