Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 27/01/12, 08:12:10
Array

[xs_avatar]
KrLx_roller KrLx_roller no está en línea
Usuario muy activo
· Votos compra/venta: (3)
 
Fecha de registro: oct 2008
Mensajes: 515
Modelo de smartphone: Xiaomi Mi 10 Pro
Tu operador: Jazztel
Verificar existencia de un String en Array de Strings

Buenas! Estoy desarrollando una aplicación en la que cuando haces clic en un Button el juego coge una String aleatoria de un Array de Strings. El problema está en que los Strings que se muestran se repiten y yo eso lo quiero evitar.

De momento he intentado solventar el problema con este código que he hecho:

Código:
next.setOnClickListener(new OnClickListener() {
        	@Override
        	public void onClick(View v) {
        		if (actualNumPlayers == 0)
        		{
        			Toast toast = Toast.makeText(getApplicationContext(),     ResourceBundle.getBundle("lang").getString("uNeedPlayers"), Toast.LENGTH_SHORT);
        			toast.setGravity(Gravity.CENTER,0,0);
        			toast.show();
        		}
        		else
        		{
        			if (a == 1)
        			{
        				trickName.setText(tricks[random.nextInt(tricks.length)]);
        				usedTricks[a] = trickName.getText().toString();
        			}
        			else
        			{
	            	    for (int b = 0; b < a; b++)
	            	    {
                                        trickName.setText(tricks[random.nextInt(tricks.length)]);
        				usedTricks[a] = trickName.getText().toString();

	            	    	if (trickName.getText().toString().equals(usedTricks[b]))
	            	    	{
	            	    		Toast toast = Toast.makeText(getApplicationContext(), "Repetido!", Toast.LENGTH_SHORT);
	                			toast.setGravity(Gravity.CENTER,0,0);
	                			toast.show();
	            	    	}
	            	    }
        			}
            	    a++;
            	    
            	    // TRUCOS NO REPETIDOS
        		}
        	}
        });
Lo que quiero hacer es que cada vez que se le da al Button, el String se almacene en el Array de Strings usedTricks, para que cuando salga otro String, si éste ya ha salido que salga otro automáticamente, si no, que se quede ahí hasta que el usuario vuelva a darle al Button.

Gracias de antemano.

Un saludo!
Responder Con Cita


  #2  
Viejo 27/01/12, 10:09:04
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Yo creo que es más fácil (y ocupará menos memoria) que almacenes las posiciones del array que ya has utilizado, y compruebes si esa posición se ha utilizado ya o no.
Responder Con Cita
  #3  
Viejo 27/01/12, 14:21:27
Array

[xs_avatar]
KrLx_roller KrLx_roller no está en línea
Usuario muy activo
· Votos compra/venta: (3)
 
Fecha de registro: oct 2008
Mensajes: 515
Modelo de smartphone: Xiaomi Mi 10 Pro
Tu operador: Jazztel
Antes de hacerlo con array de Strings ya había pensado en hacerlo con array de int, lo que pasa es que no sé como hacerlo ya que al usar random para obtener un String, si luego vuelvo a ejecutar un random para guardar la posición usada, esa posición cambia.

Resumiendo, no sé como mostrar el truco de la posición que random me dé, por ejemplo 5, y a la vez guardar 5 en un array de int.
Responder Con Cita
  #4  
Viejo 27/01/12, 15:06:39
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
int posicionObtenida = random.nextInt(tricks.length);
trickName.setText(tricks[posicionObtenida]);

De todas formas si lo que quieres es que no se puedan repetir frases yo le daría la vuelta al código.

Pondría un ArrayList (o HashMap, o lo que prefieras) de elementos disponibles, de tal forma que al principio está llena, y conforme vas obteniendo posiciones las vas eliminando, así sabes seguro que nunca se va a repetir una frase. Y cuando ese ArrayList esté vacio es que las has usado todas.
Responder Con Cita
  #5  
Viejo 28/01/12, 15:52:24
Array

[xs_avatar]
KrLx_roller KrLx_roller no está en línea
Usuario muy activo
· Votos compra/venta: (3)
 
Fecha de registro: oct 2008
Mensajes: 515
Modelo de smartphone: Xiaomi Mi 10 Pro
Tu operador: Jazztel
Muchas gracias! Funciona a la perfección, el único problema es que no se cómo utilizar random con un arraylist. Ya buscaré información al respecto y si no encuentro nada ya postearé algo.

Un saludo!

Enviado desde mi LG-P970 usando Tapatalk
Responder Con Cita
  #6  
Viejo 30/01/12, 21:28:08
Array

[xs_avatar]
KrLx_roller KrLx_roller no está en línea
Usuario muy activo
· Votos compra/venta: (3)
 
Fecha de registro: oct 2008
Mensajes: 515
Modelo de smartphone: Xiaomi Mi 10 Pro
Tu operador: Jazztel
Mi solución

Bueno, después de varios intentos y de varias maneras de hacerlo, esta es una de las versiones que más me ha convencido (teniendo en cuenta el poco nivel que aún tengo). Espero que me puedas decir que tal está. Aquí el código que se ejecutaría despues de hacer click en el botón:

rNum es un ArrayList de Integers.
tricks es un Array de Strings

Código:
randomNum = random.nextInt(tricks.length);
				
				if (rNum.contains(randomNum))
				{
					if (rNum.size() < tricks.length)
					{
						do {
							randomNum = random.nextInt(tricks.length);
						}
						while (rNum.contains(randomNum));
						
						trick = tricks[randomNum];
						trickName.setText(trick);
						rNum.add(randomNum);
					}
					else
					{
						Toast toast = Toast.makeText(getApplicationContext(), "Has llegado al límite de trucos!", Toast.LENGTH_SHORT);
		        		toast.setGravity(Gravity.CENTER,0,0);
		        		toast.show();
					}
				}
				else
				{
					trick = tricks[randomNum];
					trickName.setText(trick);
					rNum.add(randomNum);
				}
Responder Con Cita
  #7  
Viejo 30/01/12, 21:45:04
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
El único fallo que le veo es que el do { } while() se podría hacer eterno. Por eso te decía de darle la vuelta al código.

Por lo demás lo veo bien.
Responder Con Cita
  #8  
Viejo 30/01/12, 22:18:24
Array

[xs_avatar]
KrLx_roller KrLx_roller no está en línea
Usuario muy activo
· Votos compra/venta: (3)
 
Fecha de registro: oct 2008
Mensajes: 515
Modelo de smartphone: Xiaomi Mi 10 Pro
Tu operador: Jazztel
Si te soy sincero, te habia hecho caso y funcionaba bien, hasta que salia en randomNum un número que ya habia salido antes y por tanto eliminado, es decir, me tiraba un FC de nullPointerException al intentar coger del array un string con ese número, y no lo podía solventar ni verificando antes si ya estaba o no, así que este modo es el que mejor me ha funcionado hasta el momento.

He probado de llegar hasta el final del array y ningún problema. Lo del bucle lo he solucionado sacando fuera del do{} algunas cosillas y eliminando algunas otras inútiles. Incluso he añadido más items en el array sin tocar nada en el archivo .java y funciona a las mil maravillas (que es principalmente una de las cosas que buscaba).

De momento lo creo que lo dejaré asi porque no me ha dado ningún problema ni FC ni bucle.

Gracias por tu gran ayuda.
Responder Con Cita
  #9  
Viejo 30/01/12, 23:13:54
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Hombre, supongo que con pocos elementos mucha mala suerte tienes que tener, pero imagina que tienes 1000 elementos y solo te queda 1.

Se repetiría el bucle do { } while() haciendo random entre 1 y 1000 buscando ese número que falta, eso puede eternizarse.

En cambio si tienes un ArrayList de Strings con todos los elementos al principio, hacen un random con la longitud de ese ArrayList, la posición que te sale la eliminas, después hacen un random con la nueva longitud del ArrayList (que será una menos). Siempre vas a obtener un String que no ha salido antes a la primera, y sabrás que no hay disponibles cuando la longitud del ArrayList sea 0.
Responder Con Cita
  #10  
Viejo 31/01/12, 08:16:30
Array

[xs_avatar]
KrLx_roller KrLx_roller no está en línea
Usuario muy activo
· Votos compra/venta: (3)
 
Fecha de registro: oct 2008
Mensajes: 515
Modelo de smartphone: Xiaomi Mi 10 Pro
Tu operador: Jazztel
 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Hombre, supongo que con pocos elementos mucha mala suerte tienes que tener, pero imagina que tienes 1000 elementos y solo te queda 1.

Se repetiría el bucle do { } while() haciendo random entre 1 y 1000 buscando ese número que falta, eso puede eternizarse.
No creo que necessite tantos elementos, pero supongo que algún centenar si qué necesitare. No te había entendido cuando habías dicho que se podría eternizar. Tienes toda la razón.

Volveré a intentar lo que me has dicho, a ver si termino de una vez el maldito Random para que quede perfecto xd Ya publicaré cómo queda el código.

Un saludo!

Enviado desde mi LG-P970 usando Tapatalk
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 01:05:15 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /