java 排列顺序,java实现排列组合合怎么做

使用笛卡尔积java对List进行排列组合 - 李炎 - ITeye技术网站
博客分类:
public class Test1 {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
ArrayList l1 = new ArrayList();
l1.add(1);
l1.add(2);
l1.add(3);
ArrayList l2 = new ArrayList();
l2.add("a");
l2.add("b");
ArrayList l3 = new ArrayList();
l3.add("+");
l3.add("-");
ArrayList ls = new ArrayList();
ls.add(l1);
ls.add(l2);
ls.add(l3);
List list = Dikaerji0(ls);
System.out.println(list.size());
for (Object object : list) {
System.out.println(object);
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ArrayList Dikaerji0(ArrayList al0) {
ArrayList a0 = (ArrayList) al0.get(0);// l1
ArrayList result = new ArrayList();// 组合的结果
for (int i = 1; i & al0.size(); i++) {
ArrayList a1 = (ArrayList) al0.get(i);
ArrayList temp = new ArrayList();
// 每次先计算两个集合的笛卡尔积,然后用其结果再与下一个计算
for (int j = 0; j & a0.size(); j++) {
for (int k = 0; k & a1.size(); k++) {
ArrayList cut = new ArrayList();
if (a0.get(j) instanceof ArrayList) {
cut.addAll((ArrayList) a0.get(j));
cut.add(a0.get(j));
if (a1.get(k) instanceof ArrayList) {
cut.addAll((ArrayList) a1.get(k));
cut.add(a1.get(k));
temp.add(cut);
if (i == al0.size() - 1) {
论坛回复 /
(0 / 1279)
浏览: 46917 次
来自: 上海
我遇到关于串口通信的问题,请指教啊,我qq
xiaoliu52013 写道请问您这个程序是适用于所有串口电 ...
请问您这个程序是适用于所有串口电子称吗?是否需要配置与电子称相 ...
很牛啊。支持一下。&&&&6位数,共有几种排列组合的算法java实现
6位数,共有几种排列组合的算法java实现
6位数,共有几种排列组合的算法,java实现
若举报审核通过,可奖励20下载分
被举报人:
bobsunjack
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行& & import java.util.ArrayL& & import java.io.*;& & //换位法生成全排列& & class ReplaceArrangement{& & //从控制台读入数据& & private static String readDataFromConsole(String prompt) {& & BufferedReader br = new BufferedReader(new InputStreamReader(System.in));& & String str =& & try {& & System.out.print(prompt);& & str = br.readLine();& & } catch (IOException e) {& & e.printStackTrace();& & }& && & }& & public static void main(String args[]){& & class Node{& & int value = 0;// 元素值& & int dir = -1;// 0 : 左向箭头,1:有向箭头& & }& & System.out.println("------换位法求全排列---------");& & System.out.println("----第一个排列必须有序------");& & int n = 0;//元素个数& & boolean flag =//从控制台读入数据不合法的话,该值一直为true& & while(flag){& & try{& & n = Integer.parseInt(readDataFromConsole("请输入待排序元素个数: "));& & flag =& & }catch(Exception e){& & System.out.println("请输入整数.");& & }& & }& & flag =& & ArrayList nodes = new ArrayList(n);& & Node node =& & for(int i = 1;i <=i++){//排列初始化& & node =&new Node();&& & while(flag){& & try{& & node.value = Integer.parseInt(readDataFromConsole("请输入第" + i + "个元素的值: "));& & flag =& & }catch(Exception e){& & System.out.println("请输入整数.");& & }& & }& & flag =& & node.dir = 0;& & nodes.add(node);& & node =& & }& & for(int i = 0;i <i++){& & System.out.print(nodes.get(i).value + "\t");& & }& & System.out.println();& & int count = 1;& & while(true){& & int j = 0; // 记录最大活动整数下标& & int Max = 0;& & for(int i = 0;i <i++){ // 找出最大活动整数& & if(0 == i && 0 == nodes.get(i).dir){& & Max = M& & }else if(n-1 == i && 1 == nodes.get(i).dir){ /// 此处应该是一次空操作,不可以轻易将Max 置为 0 ********& & Max = M& & }else if(0 == nodes.get(i).dir && i>0 && nodes.get(i).value>nodes.get(i - 1).value && nodes.get(i).value>Max){& & Max = nodes.get(i).& & j =& & }else if(1 == nodes.get(i).dir && inodes.get(i + 1).value && nodes.get(i).value > Max){& & Max = nodes.get(i).& & j =& & }& & }& & //cout <<& & //cout << j << " " << Max <<& & if( 0 == Max ) // 没有活动整数& && & if( 0 == nodes.get(j).dir)&// 交换最大整数与其相邻的数及方向& & {& & int temp,& & temp =nodes.get(j).& & dirtemp=nodes.get(j).& & nodes.get(j).value=nodes.get(j - 1).& & nodes.get(j).dir=nodes.get(j - 1).& & nodes.get(j - 1).value=& & nodes.get(j - 1).dir=& & }& & else if( 1 == nodes.get(j).dir)& & {& & int temp,& & temp =nodes.get(j).& & dirtemp=nodes.get(j).& & nodes.get(j).value=nodes.get(j + 1).& & nodes.get(j).dir=nodes.get(j + 1).& & nodes.get(j + 1).value=& & nodes.get(j + 1).dir=& & }& & for(int i=0;i<n;i++)//变换比最大活动整数大的数的方向& & {& & if(nodes.get(i).value>Max)& & {& & if(0 == nodes.get(i).dir){& & nodes.get(i).dir=1;& & }else if(1 == nodes.get(i).dir){& & nodes.get(i).dir=0;& & }& & }& & }& & for(int i=0;i<n;i++){& & System.out.print(nodes.get(i).value + "\t");& & }& & count++;& & System.out.println();& & }& & System.out.println("排列总数为:" + count);& & }& & }& & 摘自 qiaoning13256的专栏
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益当前访客身份:游客 [
当前位置:
发布于 日 18时,
非重组合,非重排列,可重组合,可重排列非递归实现,高效前年写的一个只有组合算法http://www.oschina.net/code/snippet_63
代码片段(1)
GenComb.java&~&9KB&&&&
package com.caipiao.
* 排列组合 非递归实现
import java.util.ArrayL
import java.util.D
import java.util.L
public class GenComb
public static void main(String[] args)
String src_str = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T";
ArrayList&String& result = new ArrayList&String&();
long start = new Date().getTime();
GenCom(src_str, ",", 3, result);
long end = new Date().getTime() -
System.out.println("Com:" +
result.size() + ":" + end);
result.clear();
start = new Date().getTime();
GenPerm(src_str, ",", 2, result);
end = new Date().getTime() -
System.out.println("Perm:" +
result.size() + ":" + end);
for (int i=0; i&result.size(); ++i)
System.out.println( (i+1) + ": " + result.get(i));
//组合算法
* 实际移位
public static void GenCom(String srcStr, String sep, int n, List&String& result)
String[] str_list = srcStr.split(sep);
int[] pos = new int[n];
//选不出来
if (str_list.length & n || str_list.length &=0 || n &= 0)
//初始化前n是选号位
for(int i=0; i&n; i++)
//循环处理
while(true)
//1.生成选择数据
StringBuffer buff = new StringBuffer();
for(int i=0; i&n; i++)
if (i & 0)
buff.append(sep);
buff.append(str_list[pos[i]]);
result.add(buff.toString());
//从选号位最右边开始,选择第一个可以右移的位置进行进位
boolean is_move =
for (int i=n-1; i&=0; i--)
if (pos[i] & str_list.length-n+i)
//可以进位
pos[i]++; //选位右移
//所有右边的选号全部归位
for (int k=i+1; k&n; ++k)
pos[k] = pos[i] + k -
if (!is_move) //没有成功移位,到头了
//排列算法
public static void GenPerm(String srcStr, String sep, int n, List&String& result)
String[] str_list = srcStr.split(sep);
int[] pos = new int[n];
//选不出来
if (str_list.length & n || str_list.length &=0 || n &= 0)
//初始化前n是选号位
for(int i=0; i&n; i++)
//先算组合,对组合计算全排列
//循环处理
while(true)
//pos为选择位,pos_为排列位
//生成排列数据
int[] pos_ = new int[n];
for(int i=0; i&n; i++)
pos_[i] = pos[i];
//阶乘,排列个数
int total = factorial(n);
//生成选好号位的排列
for (int i=0,p=0; i& i++)
//生成选择数据
StringBuffer buff = new StringBuffer();
for(int k=0; k&n; k++)
if (k & 0)
buff.append(sep);
buff.append(str_list[pos_[k]]);
result.add(buff.toString());
if (p==(n-1))
if (n & 1)
int tmp = pos_[p];
pos_[p] = pos_[p+1];
pos_[p+1] =
boolean is_move =
//从选号位最右边起,进位
for (int i=n-1; i&=0; i--)
if (pos[i] & str_list.length-n+i)
//可以进位
pos[i]++; //选位右移
//所有右边的选号全部归位
for (int k=i+1; k&n; ++k)
pos[k] = pos[i] + k -
if (!is_move) //没有成功移位,到头了
//允许重号排列算法
//不用移位挑选组合号码
public static void GenPosPerm(String srcStr, String sep, int n, List&String& result)
String[] str_list = srcStr.split(sep);
int[] pos = new int[n];
//选不出来
if (str_list.length &=0 || n &= 0)
//初始化前n是选号位,缺省都是第一个
for(int i=0; i&n; i++)
//循环处理
while(true)
//生成选择数据
StringBuffer buff = new StringBuffer();
for(int i=0; i&n; i++)
if (i & 0)
buff.append(sep);
buff.append(str_list[pos[i]]);
result.add(buff.toString());
boolean is_move =
//从右边起,进位
for (int i=n-1; i&=0; i--)
pos[i]++; //选位右移
if (pos[i] == str_list.length) //前位需要进位
pos[i] = 0;
if (pos[i-1]+1 & str_list.length) //进位OK
pos[i-1]++;
else //无法进位
else //本位+1 OK
if (!is_move) //没有成功移位,到头了
//允许重号组合算法
//和乐透组合区别 选号位可以重复
* 实际移位
public static void GenRepCom(String srcStr, String sep, int n, List&String& result)
String[] str_list = srcStr.split(sep);
int[] pos = new int[n];
//选不出来
if (str_list.length & n || str_list.length &=0 || n &= 0)
//初始化首位是选号位
for(int i=0; i&n; i++)
//循环处理
while(true)
//生成选择数据
StringBuffer buff = new StringBuffer();
for(int i=0; i&n; i++)
if (i & 0)
buff.append(sep);
buff.append(str_list[pos[i]]);
result.add(buff.toString()); //生成号码
//从选号位最右边起,进位
boolean is_move =
for (int i=n-1; i&=0; i--)
if (pos[i] & (str_list.length-1))
//可以进位
pos[i]++; //选位右移
//所有右边的选号全部归位
//归至相同位置
for (int k=i+1; k&n; ++k)
pos[k] = pos[i];
if (!is_move) //没有成功移位,到头了
private static int factorial(int n)
int res=1;
while(n&=2) res=res*(n--);
//乐透型概率的倒数, 总几开几选几
public static float circle(int zong, int kai, int xuan)
if (xuan & zong)
if (xuan &= kai)
return Combination(zong, xuan)/Combination(kai, xuan);
return Combination(zong, xuan)/Combination(zong-kai, xuan-kai);
//组合算法
private static float Combination(int Am, int An)
int li = 1;
int j = 1;
for (int i=Am - An + 1; i&=Am; i++)
li = li * i / (j++);
开源中国-程序员在线工具:
相关的代码(150)
这些算法我一直都不无会,谢谢
2楼:wy65 发表于
能不能说说思想?代码看的好费劲
开源从代码分享开始
鬼目的其它代码您现在的位置:&&>>&&>>&&>>&&>>&正文
求一个数组元素的所有排列组合
  //array为要组合的数组,size为长度,firstIndex为要放在所以组合最前面的元素,result保存所有组合,每一行为一个组合
  public int func(int[] array,int[][] result){
  //所有递归的结果都保存在result中,并且最低层的组合结果保存在最后列
  //返回本次递归组合的个数
  int size = array.
  if(size==0)//如果没有元素,不再向下递归
  return 0;
  int num = 0;//本层递归的总组合数
  int subnum = 0;//本层每个元素作为头元素,其他元素的组合个数(递归返回)
  for(int i=0;i&i++){
  int[] newArray = new int[size-1];
  for(int j=0,k=0;j&j++){//获取待排序子数组
  if(j!=i)
  newArray[k++]=array[j];
  subnum=func(newArray,result);//递归,对后面的子数组组合,并返回以array[i]开头的组合数
  //将组合好的所有新数组中的每个组合放在array[i]后面,构成本层的组合,保存到数组中
  int j = result.rows-//表示本次组合的结果从哪行开始插入,result.rows表示数组已有行数
  while(j&result.rows)
  result[j++][result.cols-size] = array[i];//将头元素加上
【责编:ivy】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航

我要回帖

更多关于 java 数组排列组合 的文章

 

随机推荐