Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions src/main/java/com/github/javafaker/Options.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.github.javafaker;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Random;

public class Options {
private final Faker faker;
private static final Random rand = new Random();

protected Options(Faker faker) {
this.faker = faker;
Expand Down Expand Up @@ -52,4 +57,36 @@ public <E> E nextElement(E[] array) {
public <E> E nextElement(List<E> list) {
return list.get(faker.random().nextInt(list.size()));
}

/**
* Returns a random subset of the input list
* @param list input list
*
* @return A random subset.
*/
public <E> List<E> getRandomSubset(final List<E> list) {
final List<E> toReturn = new ArrayList<E>();

final int inputSize = list.size();
if (inputSize == 0) {
return toReturn; // If we get an empty set, we have nothing to do but return the empty set back
}

final int subsetSize = rand.nextInt(inputSize); // Pick a subset size. Can also be the full list
final Set<Integer> subsetIndex = new HashSet<Integer>();

for (int i = 0; i < subsetSize; i++) {
int randomIndex = rand.nextInt(inputSize); // Pick a random index within the input list
while (subsetIndex.contains(randomIndex)) {
randomIndex = rand.nextInt(inputSize); // If the index is already picked, choose another one
}
subsetIndex.add(randomIndex);
}

for (final Integer index : subsetIndex) {
toReturn.add(list.get(index)); // Build the subset list
}

return toReturn;
}
}
37 changes: 37 additions & 0 deletions src/test/java/com/github/javafaker/OptionsTest.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
package com.github.javafaker;

import com.github.javafaker.repeating.Repeat;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import static org.hamcrest.Matchers.isIn;
import static org.hamcrest.Matchers.isOneOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

public class OptionsTest extends AbstractFakerTest {

private static final Logger logger = LoggerFactory.getLogger(OptionsTest.class);

private String[] options;

@Before
Expand Down Expand Up @@ -60,4 +68,33 @@ public void testNextListElement() {
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

@Test
@Repeat(times=10)
public void testRandomSubset1() {
List<Integer> list = new ArrayList<Integer>();
Random r = new Random();
// Keep the array size to a small size for runtime
int listSize = r.nextInt(100);
for (int i=0; i < listSize; i++) {
// Allow for any positive integer
list.add(r.nextInt());
}

List<Integer> subsetList = faker.options().getRandomSubset(list);
logger.info("Input list: {}", list);
logger.info("Random subset: {}", subsetList);

// Check that every element of the returned subset list is in fact in the original list
for (Integer integer : subsetList) {
assertThat(integer, isIn(list));
}
}

@Test
public void testRandomSubsetEmpty() {
List<Integer> list = new ArrayList<Integer>();
List<Integer> subsetList = faker.options().getRandomSubset(list);
assertEquals(list,subsetList);
}
}