我正在尝试获取用户输入的所有可能的单词组合。比如像aa, bb, cc
这样的单词输入应该给出
aa
bb
cc
aabb
aacc
bbaa
bbcc
ccaa
ccbb
aabbcc
aaccbb
bbaacc
bbccaa
ccbbaa
ccaabb
它们可以按任何顺序排列,但最好按排序顺序排列。
我一直试图在过去一小时内完成这项任务,我觉得我对一些我无法弄清楚并继续进行的事情感到困惑。有人可以指出我正确的方向。
到目前为止的代码是
import java.util.Arrays;
import java.util.Scanner;
public class WordCombination {
private static String[] wordlist;
private static String[] wordcomb;
public static void main(String[] argv){
Scanner a = new Scanner(System.in);
System.out.print("Enter Words:");
setWords(a.nextLine());
creatCombinations();
}
private static void setWords(String words){
System.out.println("Entered words: " + words);
wordlist = words.split("\\s+");
Arrays.sort(wordlist);
System.out.println(Arrays.toString(wordlist));
}
private static void creatCombinations(){
int size = wordlist.length;
int perm = (int) Math.pow(size, size);
int c = 1;
wordcomb = new String[perm];
String word = "";
/*
for(int i = 0; i < size; i++){
word = wordlist[i];
for(int j = 0; j < size; j++){
word += wordlist[j];
System.out.println(c + ": " + word + ".com");
c++;
}
word = "";
}*/
int l = 0;
for(int i = 0; i < size; i++){
int permj = (i+1) * size;
System.out.println("------------------> " + permj + " permutations for " + (i + 1) + " words combination");
int iterations = permj * (i+1);
System.out.println(" Iterations: " + iterations);
word = wordlist[i];
for(int j = 0; j < permj; j++){
for(int k = 0; k < i+1; k++){
int permi = i * size;
int index = permi + (k%permj);
wordcomb[c-1] += "" + wordlist[l%size];
out(l%size + "");
l++;
}
System.out.println(c + ": " + wordcomb[c-1]);
c++;
}
word = "";
}
}
private static void out(String s){
System.out.println(s);
}
}
* 编辑:我得到的输出是*
Enter Words:1 2 3
Entered words: 1 2 3
[1, 2, 3]
------------------> 3 permutations for 1 words combination
Iterations: 3
0
1: 1
1
2: 2
2
3: 3
------------------> 6 permutations for 2 words combination
Iterations: 12
Enter Words:aa bb cc
Entered words: aa bb cc
[aa, bb, cc]
------------------> 3 permutations for 1 words combination
Iterations: 3
0
1: aa
1
2: bb
2
3: cc
------------------> 6 permutations for 2 words combination
Iterations: 12
0
1
4: aabb
2
0
5: ccaa
1
2
6: bbcc
0
1
7: aabb
2
0
8: ccaa
1
2
9: bbcc
------------------> 9 permutations for 3 words combination
Iterations: 27
0
1
2
10: aabbcc
0
1
2
11: aabbcc
0
1
2
12: aabbcc
0
1
2
13: aabbcc
0
1
2
14: aabbcc
0
1
2
15: aabbcc
0
1
2
16: aabbcc
0
1
2
17: aabbcc
0
1
2
18: aabbcc
答案 0 :(得分:5)
一个问题是wordcomb[c-1]
以null
开头,而不是空字符串。添加后,null
会转换为"null"
,其余内容会添加到其中。
因此您需要将wordcomb[c-1]
初始化为空字符串:
for(int j = 0; j < permj; j++){
wordcomb[c-1] = ""; // <--------------------------
for(int k = 0; k < i+1; k++){
int permi = i * size;
int index = permi + (k%permj);
wordcomb[c-1] += "" + wordlist[l%size];
out(l%size + "");
l++;
}
System.out.println(c + ": " + wordcomb[c-1]);
c++;
}
答案 1 :(得分:3)
我认为你的方法存在根本缺陷。在输出中,置换的第一个字符=前一个字符的最后一个字符+ 1,置换的每个字符=前一个字符+ 1,这不是置换的工作方式。所以我认为不容易修复。
下面是一种使用递归的方法。它只是尝试某个位置的每个角色,然后递归到下一个位置。
import java.util.Arrays;
public class NewMain
{
public static void main(String[] args)
{
c = Arrays.asList("aa","bb","cc").toArray(new String[0]);
permutation(0);
System.out.println("Number of permutations = " + count);
}
static String[] c;
static int count = 0;
static void swap(int pos1, int pos2)
{
String temp = c[pos1];
c[pos1] = c[pos2];
c[pos2] = temp;
}
public static void permutation(int start)
{
if (start != 0)
{
for (int i = 0; i < start; i++)
System.out.print(c[i]);
System.out.println();
count++;
}
for (int i = start; i < c.length; i++)
{
swap(start, i);
permutation(start + 1);
swap(start, i);
}
}
}
打印:
aa
aabb
aabbcc
aacc
aaccbb
bb
bbaa
bbaacc
bbcc
bbccaa
cc
ccbb
ccbbaa
ccaa
ccaabb
Number of permutations = 15
答案 2 :(得分:0)
这个问题基本上是由打印null String对象引起的。尝试检查创建或打印。某处String具有空值:)
答案 3 :(得分:-1)
您应该通过调用另一种方法进行排序
Arrays.sort(sortedIDXs, new Comparator<String>() {
public int compare(String idx1,String idx2) {
//Your method of sorting here
//return 1 if string idx1 should be before, 0 if equal and -1 in opposite
}