Ray25Lee
Ray25Lee

Reputation: 65

Java - Improper Checking in For Loop

This is a chunk of code in Java, I'm trying to output random numbers from the tasks array, and to make sure none of the outputs are repeated, I put them through some other loops (say you have the sixth, randomly-chosen task "task[5]"; it goes through the for loop that will check it against every "tCheck" element, and while task[5] equals one of the tCheck elements, it will keep trying to find another option before going back to the start of the checking forloop... The tCheck[i] elements are changed at the end of each overall loop of output to the new random number settled on for the task element).

THE PROBLEM is that, despite supposedly checking each new random task against all tCheck elements, sometimes (not always) there are repeated tasks output (meaning, instead of putting out say 2,3,6,1,8,7,5,4, it will output something like 2,3,2,1,8,7,5,4, where "2" is repeated... NOT always in the same place, meaning it can sometimes end up like this, too, where "4" is repeated: 3,1,4,5,4,6,7,8)

int num = console.nextInt();                                
String[] tasks = {"1","2","3","4","5","6","7","8"};
String[] tCheck = {"","","","","","","",""};
for(int i = 0; i<= (num-1); i++){
    int tNum = rand.nextInt(8);
    for(int j = 0; j <=7; j++){
        if(tasks[tNum].equals(tCheck[j])){
            while(tasks[tNum].equals(tCheck[j])){
                tNum = rand.nextInt(8);
            }
            j = 0;
        }
    }
    tCheck[i] = tasks[tNum];
    System.out.println(tasks[tNum]+" & "+tCheck[i]);
}

None of the other chunks of code affect this part (other than setting up Random int's, Scanners, so on; those are all done correctly). I just want it to print out each number randomly and only once. to never have any repeats. How do I make it do that?

Thanks in advance.

Upvotes: 0

Views: 111

Answers (3)

AxelH
AxelH

Reputation: 14572

I used to created something similar using an ArrayList

public class Main {
    public static void main(String[] args) {

        String[] array = { "a", "b", "c", "d", "e" };
        List<String> l = new ArrayList<String>(Arrays.asList(array));
        Random r = new Random();
        while(!l.isEmpty()){
            String s = l.remove(r.nextInt(l.size()));
            System.out.println(s);
        }
    }
}

I remove a random position in the list until it's empty. I don't use any check of content. I believe that is kind of effective (Even if I create a list)

Upvotes: 0

Priyamal
Priyamal

Reputation: 2989

you can check if a certain value is inside your array with this approach.

   for(int i = 0; i<= (num-1); i++){
    int tNum = rand.nextInt(8);
     boolean exist =   Arrays.asList(tasks).contains(tNum);
      while(!exist){
     //your code
     int tNum = rand.nextInt(8);
    exist =   Arrays.asList(tasks).contains(tNum);
  }       
}

if you are using an arraylist then you can check it with contains method since you are using an array we have to get the list from the array using asList() and then use the contains method. with the help of the while loop it will keep generating random numbers untill it generates a non duplicate value.

Upvotes: 0

Bohemian
Bohemian

Reputation: 425358

Firstly, don't use arrays. Use collections - they are way more programmer friendly.
Secondly, use the JDK's API to implement this idea:

  • randomise the order of your elements
  • then iterate over them linearly

In code:

List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8");
Collections.shuffle(tasks);
tasks.forEach(System.out::println);

Job done.

Upvotes: 4

Related Questions