Ver la Versión Completa : [ CONSULTA ] Verificar existencia de un String en Array de Strings
KrLx_roller
27/01/12, 08:12:10
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:
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!
kriogeN
27/01/12, 10:09:04
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.
KrLx_roller
27/01/12, 14:21:27
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.
kriogeN
27/01/12, 15:06:39
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.
KrLx_roller
28/01/12, 15:52:24
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
KrLx_roller
30/01/12, 21:28:08
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
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);
}
kriogeN
30/01/12, 21:45:04
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.
KrLx_roller
30/01/12, 22:18:24
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.
kriogeN
30/01/12, 23:13:54
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.
KrLx_roller
31/01/12, 08:16:30
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
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.