I have a simple question. I try to get random values from a container RandomList. It works with String and int, however doesn’t work with double what is wrong and how to fix it?
Thank you
import java.util.*;
public class RandomList<T> {
private ArrayList<T> storage = new ArrayList<T>();
private Random rand = new Random(47);
public void add(T item) { storage.add(item); }
public T select() {
return storage.get(rand.nextInt(storage.size()));
}
public static void main(String[] args) {
RandomList<String> rs = new RandomList<String>();
RandomList<Integer> rs1 = new RandomList<Integer>();
RandomList<Double> rs2 = new RandomList<Double>();
double w = 1.23;
for(String s: ("The quick brown fox jumped over " +
"the lazy brown dog").split(" "))
rs.add(s);
for(int i = 0; i < 11; i++)
System.out.print(rs.select() + " ");
for (int i = 0; i < 5; i++)
rs1.add(i);
for (int i = 0; i < 5; i++)
System.out.print(rs1.select() + " ");
for (int i = 0; i < 5; i++)
w = (double)i/5;
rs2.add(w);
for (int i = 0; i < 5; i++)
System.out.print(rs2.select() + " ");
}
}
Output is brown over fox quick quick dog brown The brown lazy brown 3 0 3 1 1 0.8 0.8 0.8 0.8 0.8 , so it works for string and int, but doesn’t for double (same value each time).
You don’t have any curly braces around the for loop where you add a bunch of doubles, so it’s not executing both of the indented statements. As a result, you’re just adding one number in, rather than five. Try adding the missing braces and see if that fixes things.
For future reference, if you had declared w as a local variable inside the for loop, this wouldn’t have even compiled at all because the statement that adds w to the random list would have been referencing a variable that’s out of scope. Scoping variables to just where they’re needed can thus help prevent bugs like this.
Hope this helps!