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; } }