JAVA for creating all possible combination of words

穿精又带淫゛_ 提交于 2020-01-02 17:30:10

问题


I am trying to get all the possible combinations of words input by user. Such as words input like aa, bb, cc should give

aa
bb
cc
aabb
aacc
bbaa
bbcc
ccaa
ccbb
aabbcc
aaccbb
bbaacc
bbccaa
ccbbaa
ccaabb

They can in any order but preferably in sorted order.

I have been trying to accomplish this for past hour and I think I am confused about something that I can't figure out and keep going in circles. Can someone please point me in the right direction.

The code so far is

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);
}

}

*Edit: The output I am getting is *

    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

回答1:


I think your approach is fundamentally flawed. In your output, the first character of a permutation = the last character of the previous one + 1, and each character of a permutation = the previous character + 1, which is not how permutation work. So I don't think it can easily be fixed.

Below is a working way to do it, using recursion. It simply tries every character in a position, then recurses to the next position.

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);
      }
   }
}

Prints:

aa
aabb
aabbcc
aacc
aaccbb
bb
bbaa
bbaacc
bbcc
bbccaa
cc
ccbb
ccbbaa
ccaa
ccaabb
Number of permutations = 15



回答2:


One problem is that wordcomb[c-1] starts off as null, not an empty string. When you add to it, null gets converted to "null" and the rest gets added to it.

So you need to initialize wordcomb[c-1] to an empty string:

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++;
}



回答3:


This problem is basically caused by printing null String object. Try to check the creation or the printing. There is somewhere String that has null value :)




回答4:


You should sort by invoking another method

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 
 }


来源:https://stackoverflow.com/questions/18271094/java-for-creating-all-possible-combination-of-words

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!