求java实现String list[] = { "1", "2", "3" }; 的排列组合代码

要求输出 【1,2】【 1,3】 【2,3】 【1,2,3,】里不能有重复的,组与组不能重复(1,2和2,1重复)。
要求不能有重复的出现【2,2】list的个数是未知,不能输出1位的【1】,还要输出多位的如【1,2,3】如果list是1234,那就输出【1,2】【1,3】【1,4】【2,3】【2,4】【3,4】【1,2,3】【1,2,4】【1,3,4】【2,3,4】【1,2,3,4】,list里的是字符串,不是数,可以是String list[] = { "test", "aaa", "yyy",..... }; 可能2个,也可能100个,要求输出从少到多,先输出2个的组合,再3个4个等。

楼上的代码好复杂...其实几个循环就可以了,用不着那么多if判断

import java.util.ArrayList;

public final class SpecialStringSorter {
public static String[] sort(String[] list){
ArrayList<String> outbuilder=new ArrayList<String>();
if(list.length<2) throw new RuntimeException();//如果list长度小于2会抛出运行时异常(你想换掉就换掉,比如说返回本身)
for(int a=2;a<=list.length;a++){ //这一层循环是迭代输出括号里的元素数(a代表输出中的[]里的元素数),不断增加
for(int b=0;b<=list.length-a;b++){ //这一层循环是迭代输出括号里的开头数
for(int c=b+1;c<=list.length-a+1;c++){//这一层循环是第二个数
StringBuilder sb=new StringBuilder("[");
sb.append(list[b]);
sb.append(","+list[c]);
for(int d=1;d<a-1;d++){ //这一层循环是一个[]内容的生成循环
sb.append(","+list[c+d]);
}
sb.append("]");
outbuilder.add(sb.toString());
}
}
}
String[] result=new String[outbuilder.size()];
int i=0;
for(Object resultBuilder:outbuilder){
result[i]=(String)resultBuilder;
i++;
}
return result;
}
public static void main(String[] args){
String[] test={
"1","2","3","4"
};
String[] sortResult=sort(test);
for(String out:sortResult){
System.out.print(out);
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-24
对于这个问题,我首先需要纠正一下楼主的措辞,这是个组合问题,跟排列无关,用排列组合亦不恰当。下面说下我的想法
元素不能重复,首先应该去掉相同的元素,最好的办法是用set来实现。参考api
Arrays.asList set.addAll
其实呢,这个是一个递归的过程,考虑下面情况
对于数组 {“1”},它的组合数就是{“1”}。
如果再加上一个元素“2“到上面的数组中,那么,如果这个”2“不用,实质上跟{"1"}的情况是一样的,这与不能重复相矛盾,所以”2“一定要用,就是在"1"中再加上”2“;于是我们得到
对于数组{”1“,”2“}它的组合数是{”1“} 再加入一个{”2“}。也许你也考虑到另外一种情况,即”2“也是它的一个组合数,我们考虑丢了,为什么呢,因为在{”1“}中实质上还有一个称为空的集合。这样的话,重新整理一下:
1.对于list = {"1"},它的组合包括 {"1"},以及 empty.
2.对于list={"1","2"},它的组合包括{”1“,”2“}(在{”1“}中加了”2“),{”2“}(在empty中加入”2“),也许你还会讲还应该包括{”1“},但是这个{”1“}我们已经在第1步就已经算出来了,不用再考虑了。
按照这样的规则进行下去,你会发现这样就把所有的组合数遍历出来了。要具体的代码就等会儿,我现在有事。
第2个回答  2011-01-24
代码如下:
调用时为:
combination(list, 1, list.length, ",", false, false);
/**
* 把字符串数组按排列组合来组成新的字符串数组
* @param src 字符串数组
* @param min 从那个数组位置开始组合排列
* @param max 到那个数组位置结束
* @param mark 字符分割符
* @param isPermutation 是否是排列
* @return 按排列组合来组成新的字符串数组
*/
public static String[] combination(String[] src, int min, int max, String mark, boolean isPermutation, boolean includeSelf) {
List list = new ArrayList();
if (min > max) {
int t = max;
max = min;
min = t;
}
if (min < 1)
min = 1;
if (max < 1 || max > src.length)
max = src.length;
for (int i = min; i <= max; i++) {
combinationRecursive(list, src, new StringBuffer(""), i, 0, mark, isPermutation, includeSelf);
}
return (String[]) list.toArray(new String[0]);
}

private static void combinationRecursive(List list, String[] src, StringBuffer str, int length, int start, String mark, boolean isPermutation, boolean includeSelf) {
if (length < 1 || start > src.length || length > src.length)
return;
if (length == 1) {
if (str.length() == 0 && !includeSelf)
return;
for (int i = isPermutation ? 0 : start; i < src.length; i++) {
StringBuffer result = new StringBuffer(str);
result.append(src[i]);
list.add(result.toString().trim());
}
} else {
for (int i = isPermutation ? 0 : start; i < src.length; i++) {
StringBuffer temp = new StringBuffer(str);
combinationRecursive(list, src, temp.append(src[i] + mark), length - 1, i + 1, mark, isPermutation, includeSelf);
}
}
}
第3个回答  2011-01-21
public class abc {
public static void main(String[] args) {
String list[] = { "1", "2", "3" ,"4"};
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
for (int i = 0; i < list.length; i++) {
for (int j = i; j < list.length ; j++) {
System.out.println(list[i]+","+list[j]);
}
}
}
}
给分,再来点,分太少了
第4个回答  2011-01-24
楼上的根本就不对,也不检查下就来拿分,
楼主问个事,你这个如果要是在程序中出现了1 2 3 2 这样4个数字的话,那么你想怎么处理?

求java实现String list[] = { "1", "2", "3" }; 的排列组合代码
import java.util.ArrayList;public final class SpecialStringSorter { public static String[] sort(String[] list){ ArrayList<String> outbuilder=new ArrayList<String>();if(list.length<2) throw new RuntimeException();\/\/如果list长度小于2会抛出运行时异常(你想换掉就换掉,比如说返回本身)fo...

用java程序编写,1234这四个数进行排列组合,
import java.util.List;public class Order { public static String[] str = {"1","2","3","4"};public static void main(String[] args){ System.out.println("---");for(String s:str){ System.out.println(s+" , ");} System.out.println("---");for(String s:get2byte()...

求java 小程序 123随机排列组合 3位 111 112 113 121 122 123 131 132...
public class Testb { public static void main(String[] args){ String[] strs =new String[]{"1","2","3"};List list =new ArrayList<String>();for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ for(int k=0;k<3;k++){ list.add(strs[i]+""+strs[j]+""+strs...

java实现排列组合输出
import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.List;import java.util.Set;public class TestQiuhe { \/\/集合a{1,2,3,5,7,10},输出不多于4个元素(不重复)的加和为22的组合。 public static void main(String[] args) { int...

输入任意字符序列,输出所有两位数的排列组合JAVA代码?
import java.util.Scanner;public class Main { public static void main(String[] args) { \/\/ 创建Scanner对象,用于获取用户输入 Scanner scanner = new Scanner(System.in);System.out.print("请输入任意字符序列:");\/\/ 获取用户输入的字符序列 String str = scanner.nextLine();\/\/ 循环遍历...

将两个数组 排列组合到一个数组集合 求java 代码
import java.util.List;import java.util.Scanner;public class Test { private String[] arr1;private String[] arr2;public Test(){ \/\/数组长度可以随意改,但必须保证两个数组长度一样 arr1 = new String[3];arr2 = new String[3];initArray();} private void initArray(){ Scanner ...

用java找出这几个list,所有可能的组合,并且组合结果的list中的数据不...
import java.util.List;import java.util.TreeSet;public class MyCode { static TreeSet<String> ts = new TreeSet<>();static StringBuffer stb = new StringBuffer();public static void main(String args[]) { List<Integer> a = new ArrayList<>();a.add(1);a.add(2);a.add(3);...

显示1 2 3 4 5 6六个数字所有的排列组合
int panduan1(long x)\/\/判断3和5不在一起 { long y;int flag;while(x!=0){ y=x;if((y%100==35)||(y%100==53)){ flag=0;break;} x\/=10;} if(x==0)flag=1;return flag;} int panduan2(long x)\/\/去除包含0,7,8,9的数 { long y;int flag;while(x!=0){ y=x;if...

问个关于JAVA排列组合代码的问题
\/ public static void main(String[] args) { String[] arr={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"};int h...

java排列组合的算法 譬如我有(A,B,C,D),我想输出的结果是
我觉得可以看成数字的排列如 1 2 3 4分别代表A B C D 就是将1 2 3 4排列 四位的就是1234 三位的就是从这四个数字中取出三个数字,得到的三位数是最小的,如:取 1 2 3 可以得到123 213 321 132等等 其中123是最小的 两为数字的跟三位数字的一样 ...

相似回答