2015-08-03 8 views
0

Je génère un nombre aléatoire compris entre 40 et 50. Une fois le nombre généré, je l'imprime à l'écran et je l'ajoute à un ArrayList. Toutefois, si le numéro existe déjà dans le ArrayList, j'imprimer un message "This number already exists in Array List". Donc, le code ne devrait jamais imprimer le même numéro deux fois. Cependant, pour une raison quelconque, il continue à imprimer le même numéro deux fois même s'il existe dans la liste de tableaux. Je ne sais pas ce que je fais mal iciVérifier si le nombre existe déjà

import java.util.ArrayList; 
import java.util.Random; 

public class RandomNumber { 

    Random random = new Random(); 
    int x; 
    int l; 
    public static void main(String[] args) { 
     RandomNumber r = new RandomNumber(); 
     r.genNumber(50,40); 
    } 

    public void genNumber(int high, int low) { 
     x = random.nextInt(high-low)+low; 
     ArrayList<Integer> arl = new ArrayList<Integer>(); 


     if(!arl.contains(x)) { 
      System.out.println(x); 
      arl.add(x); 

     } else if (arl.contains(x)) { 
      System.out.println("This is already in ArrayList"); 
     } 
    } 
} 
+0

Vous venez de générer 1 nombre aléatoire dans votre principale méthode. Comment un nombre existe-t-il déjà dans ArrayList? –

+0

Dites si j'appelle la méthode plusieurs fois, le même nombre ne doit pas imprimer deux fois –

+1

'! Arl.contains (x)' est toujours 'true' car la liste est vide lorsque vous examinez cette condition - vous créez la liste sur la ligne au-dessus de la vérification. –

Répondre

1

Vous devez faire de ArrayList un champ au lieu d'une variable locale. De cette façon, il peut être réutilisé entre les appels de méthode (à condition que vous utilisiez la même instance de RandomNumber). Dans votre implémentation actuelle, l'ArrayList qui garde la trace des nombres déjà générés est jetée à la fin de la méthode.

Cela fonctionne:

import java.util.ArrayList; 
import java.util.Random; 

public class RandomNumber { 

    Random random = new Random(); 
    int x; 
    int l; 
    ArrayList<Integer> arl = new ArrayList<Integer>(); 

    public static void main(String[] args) { 
     RandomNumber r = new RandomNumber(); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 

     //r = new RandomNumber(); // created a new one - uncommenting this line will mean the List is lost and we will generate duplicates. 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
     r.genNumber(50,40); 
    } 

    public void genNumber(int high, int low){ 
     x = random.nextInt(high-low)+low; 

     if(!arl.contains(x)){ 
      System.out.println(x); 
      arl.add(x); 

     }else if(arl.contains(x)){ 
      System.out.println("This is already in ArrayList"); 
     } 
    } 
} 
+0

Toujours imprimer le même nombre deux fois –

+0

Oui seulement parce qu'il crée un nouvel objet de la classe – Johan

+0

essayez de supprimer cette ligne - "r = new RandomNumber(); // a créé un nouveau ...". Je l'ai ajouté pour démontrer que si vous créez une autre instance, elle générera deux fois les mêmes nombres. Vous devez utiliser le même objet RandomNumber. – user1886323

-1

En fait, je pense que vous êtes mal compris l'erreur. Vous créez une ArrayList à chaque fois que vous appelez votre méthode, elle commence donc toujours vide. Donc, pas de problème pour lui ajouter le nombre aléatoire. Pour corriger ce problème, vous devez déplacer votre arl de cette méthode afin qu'elle soit créée une seule fois et qu'elle reste active jusqu'à ce que votre application soit terminée (ou jusqu'à ce que vous ayez fini de stocker des nombres aléatoires).

+0

ArrayList arl = new ArrayList (); J'ai déplacé cela en dehors de la méthode, mais toujours le même résultat –

+1

poster le nouveau code. –

2

La logique dans votre code est cassée. D'abord, lorsque vous vérifiez if(!arl.contains(x)), arl est vide, donc cette condition est toujours vraie. Plus important encore, si vous souhaitez conserver uniquement des nombres uniques, utilisez un Set au lieu d'un List. Et cet ensemble doit être global, c'est-à-dire déclaré en dehors de la méthode genNumber. Le code ci-dessous devrait fonctionner (non testé, et j'ai conservé vos structures de données d'origine).

import java.util.ArrayList; 
import java.util.Random; 

public class RandomNumber { 

    Random random = new Random(); 
    int x; 
    int l; 
    ArrayList<Integer> arl; 

    public RandomNumber() { 
     arl = new ArrayList<>(); 
    } 

    public static void main(String[] args) { 
     RandomNumber r = new RandomNumber(); 
     r.genNumber(50,40); 
    } 

    public void genNumber(int high, int low){ 
     x = random.nextInt(high-low)+low; 
     if(!arl.contains(x)) { 
      System.out.println(x); 
      arl.add(x); 
     } else { 
      System.out.println("This is already in ArrayList"); 
     } 
    } 
}