package stdlib; /** * Provides methods to generate arrays of Integer objects, * arrays of doubles in [0.0,1.0), and arrays of characters. */ public class ArrayGenerator { /** * Generate an array of strings from a string. Each array element will be a string of length one. * For example *
* fromString("DOG") generates the array { "D", "O", "G" } ** * @see In#readAllStrings() * @see StdIn#readAllStrings() */ public static String[] fromString (String s) { int N = s.length(); String[] a = new String[N]; for (int i = 0; i < N; i++) a[i] = s.substring(i, i+1); return a; } /** * Generate an array of doubles from a string. The string should include a list of numbers, separated by single spaces. * For example *
* doublesFromString("10.3 -Infinity 11)" generates the array { 10.3, -Infinity, 11.0 } ** * @see java.lang.Double#parseDouble(java.lang.String) */ public static double[] doublesFromString (String s) { if ("".equals (s)) return new double[0]; // empty array is a special case String[] nums = s.split (" "); double[] result = new double[nums.length]; for (int i = nums.length - 1; i >= 0; i--) { try { result[i] = Double.parseDouble (nums[i]); } catch (NumberFormatException e) { throw new IllegalArgumentException (String.format ("Bad argument \"%s\": could not parse \"%s\" as a double", s, nums[i])); } } return result; } /** * Generate an array of ints from a string. The string should include a list of numbers, separated by single spaces. * For example *
* doublesFromString("10 11)" generates the array { 10, 11.0 } ** * @see java.lang.Integer#parseInt(java.lang.String) */ public static int[] intsFromString (String s) { if ("".equals (s)) return new int[0]; // empty array is a special case String[] nums = s.split (" "); int[] result = new int[nums.length]; for (int i = nums.length - 1; i >= 0; i--) { try { result[i] = Integer.parseInt (nums[i]); } catch (NumberFormatException e) { throw new IllegalArgumentException (String.format ("Bad argument \"%s\": could not parse \"%s\" as a int", s, nums[i])); } } return result; } /** * Generate an array of length N whose values are chosen uniformly from the range [minValue,maxValue). */ public static int[] intRandom (int N, int minValue, int maxValue) { if (N < 0) throw new IllegalArgumentException (); int[] a = new int[N]; for (int i = 0; i < N; i++) { a[i] = StdRandom.uniform (minValue, maxValue); } return a; } /** * Generate an array of length N whose values are chosen uniformly from the range [0,numValues). */ public static int[] intRandom (int N, int numValues) { if (N < 0) throw new IllegalArgumentException (); int[] a = new int[N]; for (int i = 0; i < N; i++) { a[i] = StdRandom.uniform (numValues); } return a; } /** * Generate an array of length N with values 0, 1, ..., N-1. */ public static int[] intSortedUnique (int N) { if (N < 0) throw new IllegalArgumentException (); int[] a = new int[N]; for (int i = 0; i < N; i++) { a[i] = i; } return a; } /** * Generate an array of length N with values N-1, N-2, ... 0. */ public static int[] intReverseSortedUnique (int N) { if (N < 0) throw new IllegalArgumentException (); int[] a = new int[N]; for (int i = 0; i < N; i++) { a[i] = N - 1 - i; } return a; } /** * Generate a shuffled array of length N with unique values 0, 1, ... N-1 */ public static int[] intRandomUnique (int N) { int[] a = intSortedUnique (N); StdRandom.shuffle (a); return a; } /** * Generate a partially sorted array with unique elements. * The number of inversions will be between N and 2N. * This algorithm moves random elements an arbitrary amount until the threshold is achieved. */ public static int[] intPartiallySortedUnique (int N) { if (N < 6) throw new IllegalArgumentException ("array too small"); int[] a = intSortedUnique (N); int totalDistance = 0; // this is an approximation of the number of inversions int range = (int) (Math.sqrt (N)); while (totalDistance < N) { int i = StdRandom.uniform (N); int r = StdRandom.uniform (Math.max (0, i-range), Math.min (N-1, i+range)); totalDistance += Math.abs (i - r); int temp = a[i]; a[i] = a[r]; a[r] = temp; } return a; } /** * Generate a partially sorted array with unique elements. * The number of inversions will be between N and 2N. * This algorithm moves all elements a small amount. */ public static int[] intPartiallySortedUnique2 (int N) { if (N < 6) throw new IllegalArgumentException ("array too small"); int[] a = intSortedUnique (N); int range = 4; for (int i=0; i