Yeah, sorry, I forgot about the hard coded enuf. Gary
On Aug 5, 2017 11:37 AM, "Gilles" <[email protected]> wrote: > On Sat, 5 Aug 2017 09:47:20 -0700, Gary Gregory wrote: > >> On Fri, Aug 4, 2017 at 1:59 PM, Gilles <[email protected]> >> wrote: >> >> Hi Gary. >>> >>> On Fri, 4 Aug 2017 11:10:57 -0700, Gary Gregory wrote: >>> >>> For example, I have a enum like: >>>> >>>> public enum CardinalDirection (NORTH,SOUTH,EAST,WEST) >>>> >>>> and I want to say >>>> >>>> traveler.travel(nextRandomDirection()); >>>> >>>> where >>>> >>>> public CardinalDirection nextRandomDirection() { >>>> return rng.next(CardinalDirection.class); >>>> } >>>> >>>> >>> Actually, "Commons RNG" already provides all the necessary functionality >>> for a one-liner: >>> >>> ---CUT--- >>> import java.util.Arrays; >>> import org.apache.commons.rng.simple.RandomSource; >>> import org.apache.commons.rng.sampling.CollectionSampler; >>> >>> CollectionSampler<CardinalDirection> r >>> = new CollectionSampler<>(RandomSource.create(RandomSource.SPLIT_ >>> MIX_64), >>> Arrays.asList(CardinalDirectio >>> n.values())); >>> >>> CardinalDirection e = r.sample(); >>> ---CUT--- >>> >>> >> Very nice, thank you. >> >> I can see a wrapper for this boilerplate though: >> >> public class RandomEnum<E> { >> >> private final Class<E> enumClass; >> private final CollectionSampler<CellDirection> rng; >> >> public RandomEnum(final Class<E> enumClass) { >> super(); >> this.enumClass = enumClass; >> this.rng = new >> CollectionSampler<>(RandomSource.create(RandomSource.SPLIT_MIX_64), >> Arrays.asList(CellDirection.values())); >> >> } >> >> public CellDirection next() { >> return rng.sample(); >> } >> >> @Override >> public String toString() { >> return "RandomEnum [rng=" + rng + ", enumClass=" + enumClass + "]"; >> } >> } >> > > I guess there is a mix of generics and "specifics" here (cf. > "CellDirection"). And if you have only have a generic "E" in > that class, you won't be able to call "E.values()". > Then see also my other post: > http://markmail.org/message/h63yb7ozk4nyjagj > > However, what does one gain with having to call this one-liner: > RandomEnum<SomeEnum> r = > new RandomEnum<SomeEnum>(SomeEnum.class, > RandomSource.create(RandomSou > rce.SPLIT_MIX_64)); > vs the one I've suggested above? > > Gilles > > [...] >>> >> > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
