2

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
Vish
  • 4,508
  • 10
  • 42
  • 74

4 Answers4

5

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++;
}
Bernhard Barker
  • 54,589
  • 14
  • 104
  • 138
  • 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 0 1 4: 12 2 0 5: 31 1 2 6: 23 0 1 7: 12 2 0 8: 31 1 2 9: 23 ------------------> 9 permutations for 3 words combination Iterations: 27 0 1 2 10: 123 0 1 2 11: 123 0 1 2 12: 123 0 1 2 13: 123 0 1 2 14: 123 0 1 2 15: 123 0 1 2 16: 123 0 1 2 17: 123 0 1 2 18: 123 – Vish Aug 16 '13 at 10:37
  • the null problem is solved but the permutations are still not working. Thats the problem. – Vish Aug 16 '13 at 10:39
3

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
Bernhard Barker
  • 54,589
  • 14
  • 104
  • 138
0

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 :)

Frenk
  • 56
  • 4
-1

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 
 }