class Main {
public static void main(String[] args) {
String frase = "abc";
System.out.println("Frase: " + frase);
System.out.println("* Frases geradas com tamaho fixo:");
(new GeraPalabraComTamanhoFixo()).gerar(frase);
System.out.println("----------");
System.out.println("* Frases geradas com todas possibilidades: ");
(new GeraPalabraTodasPossibilidades()).gerar(frase);
System.out.println("----------");
System.out.println("* Letras geradas com base em um intervalo de letras: ");
String caracteresIniciais = "AA";
String caracteresFinais = "CC";
(new GeraCombinacaoAlfabeto()).gerar(caracteresIniciais, caracteresFinais);
System.out.println("----------");
System.out.println("* V2 - Letras geradas com base em um intervalo de letras: ");
(new GeraCombinacaoAlfabetoV2()).gerar(caracteresIniciais, caracteresFinais);
}
}
import java.util.ArrayList;
import java.util.List;
class GeraPalabraComTamanhoFixo {
public void gerar(String frase) {
List<String> resultado = new ArrayList<String>();
geraNovaPalavra(resultado, frase, frase.length(), "");
for (String palavra : resultado) {
System.out.println(palavra);
}
}
private void geraNovaPalavra(List<String> resultado, String palavra, int tamanho, String palavraAtual) {
String palavraCorrente = palavraAtual;
for (int i = 0; i < palavra.length(); i++) {
palavraCorrente += palavra.charAt(i);
if (palavraCorrente.length() >= tamanho) {
resultado.add(palavraCorrente);
palavraCorrente = palavraAtual;
} else {
geraNovaPalavra(resultado, palavra, tamanho, palavraCorrente);
palavraCorrente = palavraAtual;
}
}
}
}
import java.util.ArrayList;
import java.util.List;
class GeraPalabraTodasPossibilidades {
public void gerar(String frase) {
List<String> resultado = new ArrayList<String>();
geraNovaPalavra(resultado, frase, "");
for (String palavra : resultado) {
System.out.println(palavra);
}
}
private void geraNovaPalavra(List<String> resultado, String palavra, String palavraAtual) {
String palavraCorrente = palavraAtual;
for (int i = 0; i < palavra.length(); i++) {
palavraCorrente += palavra.charAt(i);
if (palavraCorrente.length() >= palavra.length()) {
resultado.add(palavraCorrente);
palavraCorrente = palavraAtual;
} else {
resultado.add(palavraCorrente);
geraNovaPalavra(resultado, palavra, palavraCorrente);
palavraCorrente = palavraAtual;
}
}
}
}
import java.util.ArrayList;
import java.util.List;
class GeraCombinacaoAlfabeto {
public void gerar(String caracteresIniciais, String caracteresFinais) {
int tamanho = caracteresIniciais.length();
List<String> sequencias = montarCombinacoes(caracteresIniciais, caracteresFinais);
sequencias = normalizarSequencia(sequencias, caracteresIniciais);
int totalLinhas = (int) Math.pow(sequencias.get(0).length(), tamanho);
int totalGrupos = totalLinhas / sequencias.get(0).length();
List<char[]> combinacoes = new ArrayList<>();
for (int i = 0; i < totalLinhas; i++) {
combinacoes.add( new char[tamanho] );
}
if (tamanho == 1) {
for (int i = 0; i < totalLinhas; i++) {
int proximaColuna = 0;
char letra = sequencias.get(0).charAt(i);
montar(combinacoes, sequencias.get( proximaColuna ), letra, tamanho, i);
}
} else if (tamanho == 2) {
for (int i = 0; i < totalGrupos; i++) {
int proximaColuna = tamanho-(tamanho-1);
int indice = i*totalGrupos;
char letra = sequencias.get(proximaColuna-1).charAt(i);
montar(combinacoes, sequencias.get( proximaColuna ), letra, tamanho, indice);
}
} else {
System.out.println("Não foi implementado para uma sequência de " + tamanho + " caracteres.");
return;
}
for (char[] combinacao : combinacoes) {
System.out.println( String.valueOf(combinacao) );
}
}
public void montar(List<char[]> combinacoes, String letras, char letraBase, int tamanho, int indice) {
if (tamanho == 1) {
combinacoes.get(indice)[0] = letraBase;
} else {
for (int i = 0; i < letras.length(); i++) {
combinacoes.get(indice)[0] = letraBase;
combinacoes.get(indice)[1] = letras.charAt(i);
indice++;
}
}
}
/**
* Monta todas as combinações possíveis com base na sequencia inicial e final.
* @param sequenciaInicial Sequencia inicial de caracteres.
* @param sequenciaFinal Sequencia final de caracteres.
* @return
*/
private List<String> montarCombinacoes(String sequenciaInicial, String sequenciaFinal) {
List<String> sequencias = new ArrayList<>();
for (int i = 0; i < sequenciaInicial.length(); i++) {
int hexaIni = sequenciaInicial.toUpperCase().charAt(i);
int hexaFin = sequenciaFinal.toUpperCase().charAt(i);
String sequencia = "";
for (int codigoHex = hexaIni; codigoHex <= hexaFin; codigoHex++) {
sequencia += String.valueOf((char) codigoHex);
}
sequencias.add(sequencia);
}
return sequencias;
}
/**
* Verifica as Sequencias de caracteres e completa as menores com o caractere da sequencia inicial.
* @param sequencias Lista de sequencias de caracteres.
* @param sequenciaInicial Sequencia inicial de caracteres.
* @return
*/
private List<String> normalizarSequencia(List<String> sequencias, String sequenciaInicial) {
int tamanho = maiorSequencia(sequencias);
List<String> novasSequencias = new ArrayList<>();
for (int i = 0; i < sequencias.size(); i++) {
String s = sequencias.get(i);
if (s.length() < tamanho) {
char letra = sequenciaInicial.toUpperCase().charAt(i);
s = completarSequencia(s, letra, tamanho);
}
novasSequencias.add( s );
}
return novasSequencias;
}
/**
* Descobrir o tamanho da maior sequencia de caracteres.
* @param sequencias Lista de sequencias de caracteres.
* @return
*/
private int maiorSequencia(List<String> sequencias) {
int tamanho = 0;
for (String s : sequencias) {
if (s.length() > tamanho) tamanho = s.length();
}
return tamanho;
}
/**
* Completar uma sequencia de caracteres.
* @param sequencia Sequencia inicial.
* @param letra Letra que deve ser adicionada, caso necessário.
* @param tamanho Tamanho esperado da sequencia.
* @return
*/
private String completarSequencia(String sequencia, char letra, int tamanho) {
while (sequencia.length() < tamanho) {
sequencia += letra;
}
return sequencia;
}
}
import java.util.ArrayList;
import java.util.List;
class GeraCombinacaoAlfabetoV2 {
/**
* Gera uma sequencia de caracteres permitindo até 2 níveis.<br>
* Saída esperada ao informar como <code>caracteresInicias</code> a letra 'A' e <code>caracteresFinais</code> a letra 'C':<br>
* A | B | C <br>
* Saída esperada ao informar como <code>caracteresInicias</code> as letras 'AA' e <code>caracteresFinais</code> as letras 'CC':<br>
* AA | AB | AC | BA | BB | BC | CA | CB | CC
*
* @param caracteresIniciais
* @param caracteresFinais
* @return
* @throws Exception
*/
public void gerar(String caracteresIniciais, String caracteresFinais) {
List<String> lista = montarCombinacoes(caracteresIniciais, caracteresFinais);
lista = normalizarSequencia(lista, caracteresIniciais);
List<char[]> combinacoes = new ArrayList<>();
for (int i = 0; i < lista.get(0).length(); i++) {
if (lista.size() == 1) {
combinacoes.add(new char[] { lista.get(0).charAt(i) } );
} else if (lista.size() == 2) {
for (int x = 0; x < lista.get(1).length(); x++) {
combinacoes.add( new char[] { lista.get(0).charAt(i), lista.get(1).charAt(x) } );
}
} else {
System.out.println( "Nível não implementado." );
}
}
for (char[] item : combinacoes) {
System.out.println( item );
}
}
/**
* Monta todas as combinações possíveis com base na sequencia inicial e final.
* @param sequenciaInicial Sequencia inicial de caracteres.
* @param sequenciaFinal Sequencia final de caracteres.
* @return
*/
private List<String> montarCombinacoes(String sequenciaInicial, String sequenciaFinal) {
List<String> sequencias = new ArrayList<>();
for (int i = 0; i < sequenciaInicial.length(); i++) {
int hexaIni = sequenciaInicial.toUpperCase().charAt(i);
int hexaFin = sequenciaFinal.toUpperCase().charAt(i);
String sequencia = "";
for (int codigoHex = hexaIni; codigoHex <= hexaFin; codigoHex++) {
sequencia += String.valueOf((char) codigoHex);
}
sequencias.add(sequencia);
}
return sequencias;
}
/**
* Verifica as Sequencias de caracteres e completa as menores com o caractere da sequencia inicial.
* @param sequencias Lista de sequencias de caracteres.
* @param sequenciaInicial Sequencia inicial de caracteres.
* @return
*/
private List<String> normalizarSequencia(List<String> sequencias, String sequenciaInicial) {
int tamanho = maiorSequencia(sequencias);
List<String> novasSequencias = new ArrayList<>();
for (int i = 0; i < sequencias.size(); i++) {
String s = sequencias.get(i);
if (s.length() < tamanho) {
char letra = sequenciaInicial.toUpperCase().charAt(i);
s = completarSequencia(s, letra, tamanho);
}
novasSequencias.add( s );
}
return novasSequencias;
}
/**
* Descobrir o tamanho da maior sequencia de caracteres.
* @param sequencias Lista de sequencias de caracteres.
* @return
*/
private int maiorSequencia(List<String> sequencias) {
int tamanho = 0;
for (String s : sequencias) {
if (s.length() > tamanho) tamanho = s.length();
}
return tamanho;
}
/**
* Completar uma sequencia de caracteres.
* @param sequencia Sequencia inicial.
* @param letra Letra que deve ser adicionada, caso necessário.
* @param tamanho Tamanho esperado da sequencia.
* @return
*/
private String completarSequencia(String sequencia, char letra, int tamanho) {
while (sequencia.length() < tamanho) {
sequencia += letra;
}
return sequencia;
}
}