Lista de nomes possiveis

10 respostas
bigodines

Pessoal, estou iniciando em java.

Preciso montar uma lista de nomes possíveis. Por exemplo:
tenho um vetor { A, B } e um tamanho 3 gostaria um algoritmo que fizesse a combinação desses elementos para gerar a lista de palavras possíveis.

exemplo de saída:
A, AA, AAA, AB, AAB, B, BB, BBB, BA, BBA,BAB, ABA

Java tem alguma biblioteca que possa me ajudar a fazer isso sem ter que ficar trabalhando só com loops?

10 Respostas

ViniGodoy

Acho que só trabalhando com loops.

Mas, se isso for um exercício da faculdade, nem usar uma biblioteca pronta seria adequado.

bigodines

não é exercício de faculdade. vou procurar pra ver se eu acho alguma coisa no krugle, obrigado.

Luca

Olá

Sempre que você precisar mexer com qualquer coisa que tenha a ver com palavras verifique se o uso de expressões regulares pode ser adequado em algum trecho da solução.

[]s
Luca

S

Acho que o jeito mais fácil de fazer é com recursao.

imprimecomb(acumulado, possibilidades, passo)
if(passo &lt tamaho(possibilidades))
  para tamaho(possibilidades) faça
    imprime acumulado + possibilidade_atual
    imprimecomb (acumulado +possibilidades_atual, possibilidades, passo + 1)
bigodines

schouery:
Acho que o jeito mais fácil de fazer é com recursao.

imprimecomb(acumulado, possibilidades, passo) if(passo &lt tamaho(possibilidades)) para tamaho(possibilidades) faça imprime acumulado + possibilidade_atual imprimecomb (acumulado +possibilidades_atual, possibilidades, passo + 1)

é… vou fazer isso mesmo. Valeu pela ajuda.

bigodines

Pessoal,

seguindo a dica do amigo schouery eu produzi esta classe:
public class WordListGenerator {

	public WordListGenerator() {
		
	}
	
	public void createTable(char [] values, int size, int start) {
		System.out.println(values.toString());
		this.combine(values, "", start, size);
	}
	
	private void combine(char[] values,  String str, int step, int size) {
		//System.out.println("size:"+size+" step:"+step);
		if (step &lt size) { 
			for(int i=0; i &lt values.length; i++) {
				System.out.println(str+values[i]);
				this.combine(values, str+values[i], step+1, size);
								
			}			
		}
	}		
}
que estou utilizando da seguinte maneira:
public static void main(String[] args) {
		
		// TODO remove static configurations
		char [] values = { 'a', 'b' }; 
		System.out.println(values.length);
		int size = 3; // string size
		int start = 0; // for later use.
		WordListGenerator wl = new WordListGenerator();
		wl.createTable(values, size, start);		
		
	}

A saída está de acordo com o que eu esperava (yay!) mas como estou apenas brincando com o Java (este é um "exercício" que eu me propus pra aprender a linguagem) eu gostaria de saber se tem algum jeito de otimizar ou tornar o código melhor de acordo com os recursos da linguagem.

S

Que bom que você gostou da dica!
Acho que uma coisa que eu mudaria é utilizar StringBuffer ao invés de String, porque cada concatenação que vocês gera um novo objeto String, já que Strings são estáticas em Java.
O StringBuffer iria se alterar ao invés de criar um novo objeto.

bigodines

E como faço isso?

Eu tentei assim:
public void createTable(char [] values, int size, int start) {
		System.out.println(values.toString());
		StringBuffer str = new StringBuffer();
		this.combine(values, str, start, size);
	}
	
	private void combine(char[] values,  StringBuffer str, int step, int size) {
		//System.out.println("size:"+size+" step:"+step);
		if (step &lt size) { 
			for(int i=0; i &lt values.length; i++) {
				System.out.println(str.append(values[i]));
				this.combine(values, str.append(values[i]), step+1, size);				
			}
			
		}
	}

Mas a saída ficou toda errada:

a
aaa
aaaaa
aaaaaab
aaaaaabbb
aaaaaabbbba
aaaaaabbbbaab
aaaaaabbbbaabbb
aaaaaabbbbaabbbba
aaaaaabbbbaabbbbaaa
aaaaaabbbbaabbbbaaaab
aaaaaabbbbaabbbbaaaabbb
aaaaaabbbbaabbbbaaaabbbba
aaaaaabbbbaabbbbaaaabbbbaab

não está resetando nas chamadas não recursivas.

S

Então, o problema é que ele não tá apagando o StringBuffer, então vc precisa colocar na ultima linha do for algo do tipo:
str.deleteCharAt(str.length()-1)
mas dai dá pra melhorar, arrancar esse .length() e usar o step.
só não coloquei aqui porque não sei se ele começa no zero ou não.

bigodines

agora acho que ficou certinho né?

private void combine(char[] values,  StringBuffer str, int step, int size) {
		//System.out.println("size:"+size+" step:"+step);
		if (step &lt size) { 
			for(int i=0; i &lt values.length; i++) {
				System.out.println(str.append(values[i]));				
				this.combine(values, str, step+1, size);				
				str.deleteCharAt(step);
			}			
			
		}
	}

valeu denovo cara ;)

Criado 6 de maio de 2007
Ultima resposta 6 de mai. de 2007
Respostas 10
Participantes 4