代码改变世界

test

2013-02-21 01:39  cai-yigo  阅读(212)  评论(0编辑  收藏  举报
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;

public class test1 {
    public static final Logger log = Logger.getLogger(test1.class);
    static Map<Integer, String> ch = new LinkedHashMap<Integer, String>(27);

    public static void main(String[] args) {
        initData();
        one();
        System.out.println("=================分割线====================");
        two("d2", "h66");

    }

    /**
     * 用于把26个字母填充到ch中
     */
    public static void initData() {
        Integer t = 0;
        for (char i = 'a'; i <= 'z'; i++) {
            ch.put(t, i + "");
            t++;
        }
    }

    // 1 .分别用 java 和 javascript 建一棵树 ,
    //
    // a
    // b1 b2
    // c1 c2 c3 c4 c5 c6
    // ......
    //
    // z1 z2 ...
    //
    // a) 共26层
    // b) 第一层 1 个节点
    // c) 对 n>1, 第n层会有n * (n-1层的节点数) 个节点
    // d) 对 n>=1 and n<=25, 第n层的每个点都有n+1个下节点(儿子)
    public static void one() {
        // 0×2+1=1
        // 1×3+2=5
        // 5×4+3=23
        // 23×5+4=119
        BigInteger bi = new BigInteger("1");
        for (int i = 0; i < ch.size(); i++) {
            bi = bi.multiply(new BigInteger((i + 1) + ""));
            System.out
                    .println(ch.get(i) + " 第" + (i + 1) + "行,总数:" + bi + "\t");
            /*************************************************************/
            // 之所以中断这一段代码,是因为运行起来特别耗时
            /*************************************************************/
            for (BigInteger b = BigInteger.ZERO; b.compareTo(bi) < 0; b = b
                    .add(BigInteger.ONE)) {
                System.out.print(ch.get(i) + "" + (b.add(BigInteger.ONE))
                        + "\t");
            }
            if (i == 6) {
                break;
            }
            System.out.println();
        }
        System.out.println();
    }

    /**
     * @Description: 判断 改动后的树是否存在上下级递归的关系(如果向上相隔2层,肯定存在上下级递归关系,还要一种情况是相邻的两个字母)
     * 
     * @param s1
     *            原字母
     * 
     * @param s2
     *            新字母
     * 
     */
    public static boolean two(String s1, String s2) {
        int size_1 = Integer.valueOf(s1.substring(1));
        s1 = s1.substring(0, 1);
        int index_1 = Integer.valueOf(getKeyByValue(ch, s1).get(0).toString()) + 1;
        long count1 = getCount(index_1);
        int size_2 = s2.equals("a") ? 0 : Integer.valueOf(s2.substring(1));
        s2 = s2.substring(0, 1);
        int index_2 = Integer.valueOf(getKeyByValue(ch, s2).get(0).toString()) + 1;
        long count2 = getCount(index_2);
        System.out.println("字母:" + s1 + "\t所在层:" + index_1 + "\t共有节点:" + count1
                + "\t所在列" + size_1);
        System.out.println("字母:" + s2 + "\t所在层:" + index_2 + "\t共有节点:" + count2
                + "\t所在列" + size_2);
        if (index_1 - index_2 > 1) {
            System.out.println("存在上下级关系");
            return true;
        } else {
            long start = (size_2 - 1) * (index_2 + 1);
            long end = (size_2) * (index_2 + 1);
            if (size_1 > start && size_1 <= end) {
                System.out.println("字母" + s2 + "的下级子节点的区间为:" + s1 + start + "-"
                        + end);
                System.out.println("存在上下级关系");
                return true;
            } else {
                System.out.println("不存在上下级关系");
                return false;
            }

        }

    }

    /**
     * @Description: 根据所在层取得节点数
     * @param num
     *            所在层(如 a表示在第一层)
     * @return long
     * @throws 由于收到long长度的影响
     *             ,该段代码存在bug
     */
    public static long getCount(long num) {
        long count = 1;
        for (int i = 0; i < num; i++) {
            count = count * (i + 1);
        }
        return count;
    }

    /**
     * @Description: 根据value取得key
     * @param map
     * @param value
     * @return List value
     */
    public static List getKeyByValue(Map map, Object value) {
        List keys = new ArrayList();
        Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Entry) it.next();
            Object obj = entry.getValue();
            if (obj != null && obj.equals(value)) {
                keys.add(entry.getKey());
            }
        }
        return keys;
    }

}