Autor Tema: Java extraer palabras aleatoriamente de una lista hasta completar 30 caracteres  (Leído 12239 veces)

xeta21

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Tengo otro problema más... :( soy una pesada lo se.. T_T

tengo este código:

Código: [Seleccionar]
package obtenirparaulesalatazar;

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Random;


public class ObtenirParaulesAlAtazar {
   
      public static void main(String[] args) {
      ObtenirParaulesAlAtazar programa = new ObtenirParaulesAlAtazar();
      programa.Diccionari();       
    }
     
      void Diccionari(){
         
          int Totalparaules = Total();
          String[] diccionari = DiccionariFinal();
        //  RandomParaules( diccionari ,  Totalparaules);
          String[] palabrasNuevas = RandomParaules(diccionari , Totalparaules);
          prova (palabrasNuevas);
      }
     
      public String[] DiccionariFinal(){

        System.out.println("Programa que torna paraules al atzar  ")   ; 
 String[] diccionari = {
            "a","abadessa","abandonat","abarnegat","abat","abatussat","abissal","abnegat",
            "abrainat","abruptesa","abscissa","absolut","abstreure","acabar","acampar",
            "accent","acer","acerat","acid","aclamar","aclarir","aclarit","acrata",
            "acrobacia","adagi","adaptar","adeptes","adequar","adequat","adeu","adherir",
            "admetre","adonar","adormir","adscriure","adust","advers","advocat","afanar",
            "afany","afavorir","afavorit","afebleix","afeblit","afectat","afectiu","afectuos",
            "afegir","afer","afilar","afinar","afi","afligir","afligit","aflorar","afluent",
            "afluixar","agafar","agalla","agata","agencia","agrair","agrait","agrari","agre",
            "agregar","agror","aguila","ah","ahir","aigua","aiguat","aire","aixada","aixafar",
            "aixecar","aixeta","aixella","aixi","aixo","aixovar","ajeure","ajornar",
            "ajudar","ajupir","ajustar","ala","albada","albi","ale","alenar",
            "alevi","alga","algid","algu","alie","alla","alli","allo","alma","alpi",
            "altivesa","amagar","amanida","amanir","ambre","amorf","ample","ampliar",
            "anar","anca","angoixa","anis","ansa","apagar","apagat","apercebre",
            "apostata","arbre","aristòcrata","atreure","audiofon","autocrata",
            "baixa","bali","bandol","barata","barbar","barrera","bassal","bata",
            "benveure","benviure","bestraure","bobila","bossarrera","bravata","bufor",
            "(insulto)elobre","cantata","carabassal","carrera",
            "casal","caure","causa","celebre","censal","centaure","cercavila","circumscriure",
            "clamar","clar","cloure","codol","colossal","columnata","comensal","commoure",
            "complaure","concloure","condol","contramarc","contrapès","contreure",
            "convilatà","conviure","corbata","correra","coure","creure","cuixa","culata",
            "data","decaure","de","decebre","deixa","descloure","descriure","desfilar",
            "deslliurat","desviure","detreure","deure","distreure","egagropila","embeure",
            "emfasi","empes","entreploure","entreveure","errata","es","escandol","escarlata",
            "escata","escaure","espes","excloure","extasi","extreure","fe","febre","fetge",
            "fila","fluixa","fragata","frenopata","funebre","gaiata","gebre","glabre",
            "gramofon","heretgia","hipotesi","homofon","horabaixa","i","idol","incloure",
            "inscriure","jeure","licorera","lleure","llibre","lliure","lugubre","magnetofon",
            "malveure","manobre","marbre","membre","microfon","minotaure","moure","nombre",
            "o","olla","onda","onada","or","orca","orfebre","pagar","pagat","paper","paraula",
            "pebre","piga","plaure","plorar","ploure","pobre","postdata","prescriure","preveure",
            "promoure","prorrompre","proscriure","public","pulcre","pupitre","que","queixa","readmetre",
            "recloure","regata","reixa","remoure","retreure","rivetaire","romandre","sabata","sabre",
            "safata","salubre","serenata","sobreviure","sostreure","subscriure","tabac","tabal","tacar",
            "tacat","tacit","tacte","tactica","tactil","talar","tall","talla","tallar","talos",
            "talp","tambe","tampo","tanca","tanc","tapar","tapat","tapia","tarda","tasca",
            "tassa","taula","tauro","taxa","tebia","tecla","telefon","timbre","vaca","vacu",
            "vaga","vago","vall","vampir","vandal","vanova","vapor","vaquer","variar",
            "variat","vector","vedell","vegada","vei","veinal","veinat","vel","velada",
            "veler","vell","vena","vencer","vençut","venda","vendre","venial","venjar",
            "venjat","venosa","vent","ventar","ventre","verb","verd","veri","vers","veto",
            "veu","viure","vorera"
        };
          return diccionari;
             }
       
         public int Total(){
             
             int Totalparaules=30;
          return Totalparaules;
     
         }
             
 public String[] RandomParaules(String[] diccionari , int Totalparaules){
Random random = new Random();
String[] palabrasNuevas = new String[30];
int total = diccionari.length;
int indice = 0;
        HashSet<Integer> indicePalabras = new LinkedHashSet<Integer>();
       
while(indicePalabras.size() != Totalparaules){
int numero = random.nextInt(total);
indicePalabras.add(numero);
}
for (Integer i : indicePalabras){
palabrasNuevas[indice] = diccionari[i];
//System.out.println(palabrasNuevas[indice]);
indice++;
}
          return palabrasNuevas;

         
 } public void prova(String [] palabrasNuevas){
   
        System.out.println() ;
        System.out.println("---------------------------------------------------");
        System.out.println("Resultat es: ");
         System.out.println(Arrays.toString(palabrasNuevas));
        System.out.println("---------------------------------------------------");
        System.out.println();
         }
}

Y me recoge 30 palabras del diccionario de forma aleatoria.. este código estaría perfecto.. pero no tengo que buscar 30 palabras sino X palabras que hagan el total de 30 caracteres....

Por poner un ejemplo:

Hola (4)
Como (4)
Estas (5)
? ( 1 )
Yo (2 )
bien ( 4 )

TOTAL SERIAN 30 caracteres.

Como hago esto con el código adjunto?
« Última modificación: 03 de Noviembre 2015, 17:22 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola xeta21!

Como hacemos siempre con las personas nuevas indicarte que para pegar código en los foros debes hacerlo según se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Tienes que considerar que si haces una extracción aleatoria de palabras es posible que la búsqueda se prolongue sobre manera. Imagina que extraes palabras hasta completar 29 caracteres. Ahora necesitas que al azar salga una palabra de longitud 1 carácter. Si tienes cien palabras tendrás una posibilidad entre 100 de acertar, si tienes 1000 palabras 1 posibilidad entre 1000. Si no tuvieras una palabra de longitud 1 carácter no podrías resolver el problema.

Además deberías considerar el rediseño del código. Hay cosas que no están planteadas de una forma correcta.

Recomendamos seguir este curso paso a paso: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Este código se aproxima a lo que pretendes, pero habría que mejorarlo:

Código: [Seleccionar]
import java.util.Arrays;
import java.util.Random;

public class ObtenerPalabrasAlAzar {
    public static void main(String[] args) {
        ObtenerPalabrasAlAzar programa = new ObtenerPalabrasAlAzar();
        programa.diccionario();       
    }

    void diccionario(){

        int Totalpalabras = Total();
        String[] diccionario = diccionarioFinal();
        String[] palabrasNuevas = RandomPalabras(diccionario , Totalpalabras);
        probar (palabrasNuevas);
    }

    public String[] diccionarioFinal(){

        System.out.println("Programa que devuelve palabras al azar  ")   ;
        String[] diccionario = {
                "a","alcohol", "ana", "anis", "anita", "an", "anil", "oniel", "anillo", "america"
            };
        return diccionario;
    }

    public int Total(){

        int Totalpalabras=30;
        return Totalpalabras;

    }

    public String[] RandomPalabras(String[] diccionario , int Totalpalabras){
        Random random = new Random();
        String[] palabrasNuevas = new String[30];
        int total = diccionario.length;
        int indice = 0;
        int longitudCaracteres = 0;
        int longitudPalabraActual = 0;
        int intentos = 0;
        int i = 0;
        boolean insertar;

        while(longitudCaracteres < 30 && intentos <= 50){

            int numero = random.nextInt(total);
            longitudPalabraActual = diccionario[numero].length();
            if (longitudCaracteres < 30 && longitudPalabraActual + longitudCaracteres <= 30) {insertar = true;} else {insertar=false;}

            if (insertar) {
                palabrasNuevas[indice] = diccionario[numero];
                System.out.println ("Añadida: "+diccionario[numero] + " con una longitud "+longitudPalabraActual);
                longitudCaracteres += diccionario[numero].length();
                indice++;
            } else {System.out.println ("Rechazada: "+diccionario[numero]); }
            System.out.println ("Cuenta: "+longitudCaracteres);
            intentos++;

        }

        return palabrasNuevas;

    }

    public void probar(String [] palabrasNuevas){
        System.out.println() ;
        System.out.println("---------------------------------------------------");
        System.out.println("El resultado es: ");
        System.out.println(Arrays.toString(palabrasNuevas));
        System.out.println("---------------------------------------------------");
        System.out.println();
    }
}

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

xeta21

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
muchas gracias por tu ayuda César!

Pero tengo dos problemas con tu código!! xD

1- necesito que nunca se repitan las palabras seleccionadas por eso usé el hashset en la otra opción.

2- como quito los null? Siempre busca entre 30 palabras. y rellena hasta que hace los 30 caracteres y el resto los pone como null :S

xeta21

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Si con lo mismo.. sin saber como seguir.. T_T

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola para no usar una cantidad fija de palabras en lugar de usar un array usa una colección dinámica de objetos como ArrayList. En este curso tienes explicado cómo usar ArrayList: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Para evitar la repetición, añade en la condición que determina si insertar es true ó false, una condición que compruebe si la palabra ya está en la lista. Esto lo puedes hacer con el método contains de la clase ArrayList https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".