java实现排列组合
程序员文章站
2022-05-21 23:05:16
...
这里就直接贴代码了
package com.lh.common.util.permutation;
import java.util.ArrayList;
import java.util.List;
import com.rd.ifaes.common.exception.BussinessException;
/**
* 统计任三出现的最多的几率的组合
*
* @author lh
* @date 2016-8-12
*/
public class Copy2OfStatisAnyThree {
// 组合算法
// 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
// 代表的数被选中,为0则没选中。
// 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
// 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为
// “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
// 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得
// 到了最后一个组合。
// 例如求5中选3的组合:
// 1 1 1 0 0 //1,2,3
// 1 1 0 1 0 //1,2,4
// 1 0 1 1 0 //1,3,4
// 0 1 1 1 0 //2,3,4
// 1 1 0 0 1 //1,2,5
// 1 0 1 0 1 //1,3,5
// 0 1 1 0 1 //2,3,5
// 1 0 0 1 1 //1,4,5
// 0 1 0 1 1 //2,4,5
// 0 0 1 1 1 //3,4,5
public static void main(String[] args) {
Copy2OfStatisAnyThree s = new Copy2OfStatisAnyThree();
s.printAnyThree();
}
/**
*
*/
public void printAnyThree() {
int[] num = new int[] {0, 1, 2, 3, 4, 5 };//,
print(combine(num, 4));
}
/**
* 从n个数字中选择m个数字
*
* @param a
* @param m
* @return
*/
public List combine(int[] a, int m) {
int n = a.length;
if (m > n) {
throw new BussinessException("错误!数组a中只有" + n + "个元素。" + m + "大于" + 2 + "!!!");
}
List result = new ArrayList();
int[] bs = new int[n];
for (int i = 0; i < n; i++) {
bs[i] = 0;
}
// 初始化
for (int i = 0; i < m; i++) {
bs[i] = 1;
}
boolean flag = true;
boolean tempFlag = false;
int pos = 0;
int sum = 0;
// 首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
do {
sum = 0;
pos = 0;
tempFlag = true;
result.add(print(bs, a, m));
for (int i = 0; i < n - 1; i++) {
if (bs[i] == 1 && bs[i + 1] == 0) {
bs[i] = 0;
bs[i + 1] = 1;
pos = i;
break;
}
}
// 将左边的1全部移动到数组的最左边
for (int i = 0; i < pos; i++) {
if (bs[i] == 1) {
sum++;
}
}
for (int i = 0; i < pos; i++) {
if (i < sum) {
bs[i] = 1;
} else {
bs[i] = 0;
}
}
// 检查是否所有的1都移动到了最右边
for (int i = n - m; i < n; i++) {
if (bs[i] == 0) {
tempFlag = false;
break;
}
}
if (tempFlag == false) {
flag = true;
} else {
flag = false;
}
} while (flag);
result.add(print(bs, a, m));
return result;
}
private int[] print(int[] bs, int[] a, int m) {
int[] result = new int[m];
int pos = 0;
for (int i = 0; i < bs.length; i++) {
if (bs[i] == 1) {
result[pos] = a[i];
pos++;
}
}
return result;
}
private void print(List l) {
for (int i = 0; i < l.size(); i++) {
int[] a = (int[]) l.get(i);
for (int j = 0; j < a.length; j++) {
System.out.print(a[j] + "\t");
}
System.out.println();
}
}
}
package com.lh.common.util.permutation;
import java.util.ArrayList;
import java.util.List;
import com.rd.ifaes.common.exception.BussinessException;
/**
* 排列组合工具类
* @version 3.0
* @author lh
* @date 2016年8月12日
*/
public class PermutationUtils {
static final int [] NUM_1 = {1};
static final int [] NUM_2 = {1, 2};
static final int [] NUM_3 = {1, 2, 3};
static final int [] NUM_4 = {1, 2, 3, 4};
static final int [] NUM_5 = {1, 2, 3, 4, 5};
static final int [] NUM_6 = {1, 2, 3, 4, 5, 6};
static final int [] NUM_7 = {1, 2, 3, 4, 5, 6, 7};
static final int [] NUM_8 = {1, 2, 3, 4, 5, 6, 7, 8};
static final int [] NUM_9 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
/**
* 排列组合计算
* @author lh
* @date 2016年8月12日
* @param count 组合元素数量
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List calculate(int count){
if(count > 9){
throw new BussinessException("Currently does not support large digits");
}
int [] numdefault = getNumDefault(count);
int [] numarray = new int[count];
switch (count) {
case 1:
numarray = NUM_1;
break;
case 2:
numarray = NUM_2;
break;
case 3:
numarray = NUM_3;
break;
case 4:
numarray = NUM_4;
break;
case 5:
numarray = NUM_5;
break;
case 6:
numarray = NUM_6;
break;
case 7:
numarray = NUM_7;
break;
case 8:
numarray = NUM_8;
break;
case 9:
numarray = NUM_9;
break;
default:
break;
}
Copy2OfStatisAnyThree s = new Copy2OfStatisAnyThree();
List list = new ArrayList();
list.add(numdefault);
for (int i = 1; i < count; i++) {
list.addAll( reset(s.combine(numarray, i), count));
}
list.add(numarray);
return list;
}
/**
* 重新归位
* @author lh
* @date 2016年8月12日
* @param l
* @param numdefault
* @param len
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private static List reset(List l, int len) {
List list = new ArrayList();
for (int i = 0; i < l.size(); i++) {
int[] b = getNumDefault(len);
// 填充值
int[] a = (int[]) l.get(i);
for (int j : a) {
b[j - 1] = j;
}
list.add(b);
}
return list;
}
/**
* 给定数组默认值
* @author lh
* @date 2016年8月12日
* @param count
* @return
*/
public static int[] getNumDefault(int count){
int[] b = new int [count];
for (int k = 0; k < b.length; k++) {
b[k] = 0;
}
return b;
}
}
测试用例如下:
package com.lh.common.util.permutation;
import java.util.List;
import org.junit.Test;
public class PermutationUtilsTest {
/**
* 排列组合
*
* @author LH
* @date 2016年8月12日
*/
@SuppressWarnings("rawtypes")
@Test
public void testPermutation() {
int count = 4;
System.out.println(Math.pow(2d, Double.valueOf(count)));
List list = PermutationUtils.calculate(count);
System.out.println("list.size=" + list.size());
print(list);
}
@SuppressWarnings("rawtypes")
private static void print(List l) {
for (int i = 0; i < l.size(); i++) {
int[] a = (int[]) l.get(i);
for (int j = 0; j < a.length; j++) {
System.out.print(a[j] + "\t");
}
System.out.println();
}
}
}
The end!
下一篇: 排列组合(Java实现)