package org.nutz.lang; import java.util.ArrayList; import java.util.List; /** * A group of helper functions to counting some ... * * @author zozoh(zozohtnt@gmail.com) * @author pw */ public abstract class Maths { /** * 返回最大的一个 * * @param nums 需要比较的数组 * @return 最大值 */ public static int max(int... nums) { return takeOne(new CompareSomeThing() { public boolean compare(int arg0, int arg1) { return arg0 > arg1; } }, nums); } /** * 返回最小的一个 * * @param nums 需要比较的数组 * @return 最小值 */ public static int min(int... nums) { return takeOne(new CompareSomeThing() { public boolean compare(int arg0, int arg1) { return arg0 < arg1; } }, nums); } private interface CompareSomeThing { public boolean compare(int arg0, int arg1); } private static int takeOne(CompareSomeThing cp, int... nums) { if (null == nums || nums.length == 0) return 0; int re = nums[0]; for (int i = 1; i < nums.length; i++) { if (cp.compare(nums[i], re)) re = nums[i]; } return re; } /** * Convert a binary string to a integer * * @param s * binary string * @return integer */ public static int bit(String s) { return Integer.valueOf(s, 2); } /** * Test current bit is match the given mask at least one bit or not. * * @param bs * integer, bit map * @param mask * another bit map * @return if one of bit value is '1' in mask, and it is also is '1' in bs * return true, else false */ public static boolean isMask(int bs, int mask) { return 0 != (mask & bs); } public static boolean isNoMask(int bs, int mask) { return 0 == (bs & mask); } /** * Test current bit is all match the give mask. * * @param bs * integer, bit map * @param mask * another bit map * @return if all bit value is '1' in mask, and it is also is '1' in bs * return true, else false */ public static boolean isMaskAll(int bs, int mask) { return 0 == ~((~mask) | bs); } /** * Get part of one integer as a new integer * * @param bs * original integer * @param low * the low bit position (inclusive), 0 base * @param high * the hight bit position (exclusive), 0 base * @return new integer */ public static int extract(int bs, int low, int high) { bs = bs >> low; int mask = 0; for (int i = 0; i < (high - low); i++) { mask += 1 << i; } return bs & mask; } /** * 获得字符数组的全排列 * * @param arr 字符数组 * @return 全排列 */ public static String[] permutation(char... arr) { return permutation(arr.length, arr); } /** * 按照指定长度, 获得字符数组的全排列 * * @param arr 字符数组 * @return 全排列 */ public static String[] permutation(int length, char... arr) { if (arr == null || arr.length == 0 || length <= 0 || length > arr.length) { return null; } List<String> slist = new ArrayList<String>(); char[] b = new char[length]; // 辅助空间,保存待输出组合数 getCombination(slist, arr, length, 0, b, 0); return slist.toArray(new String[]{}); } // --------------------------- 以下为几个辅助方法 private static void getCombination(List<String> slist, char[] a, int n, int begin, char[] b, int index) { if (n == 0) {// 如果够n个数了,输出b数组 getAllPermutation(slist, b, 0);// 得到b的全排列 return; } for (int i = begin; i < a.length; i++) { b[index] = a[i]; getCombination(slist, a, n - 1, i + 1, b, index + 1); } } private static void getAllPermutation(List<String> slist, char[] a, int index) { /* 与a的元素个数相同则输出 */ if (index == a.length - 1) { slist.add(String.valueOf(a)); return; } for (int i = index; i < a.length; i++) { swap(a, index, i); getAllPermutation(slist, a, index + 1); swap(a, index, i); } } private static void swap(char[] arr, int i, int j) { char temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }