Есть ли лучший способ написать этот метод в Java — Генератор случайных чисел

#java #javafx

Вопрос:

У меня есть этот метод, который принимает массив значений spinner. Он берет значения и добавляет их к префиксу с 9 случайными цифрами.

До сих пор у меня было довольно много префиксов, которые сопровождают каждое значение счетчика.

Каждое значение проверяет, больше ли оно 0, перебирает количество значений, затем добавляет префикс 9 цифр. например, значение R1 = 10, затем массив выплевывается с R1 9ДИГИТАМИ 10 раз

Существует так много утверждений «если», и я уверен, что был бы лучший способ. Вы можете увидеть ниже его чрезвычайно повторяющийся. Любая помощь или идеи будут оценены по достоинству. Спасибо!

 Spinnerlt;Integergt;[] spinners = new Spinner[]{  r1Spinner, r2Spinner, r3Spinner, r5Spinner, rd2Spinner, rd8Spinner,m1Spinner,gSpinner, srSpinner, lcSpinner, singleURNSpinner,  customPrefixSpinner, prefixSpinner};   public static String[] randomPrefixGenerator(int[] values){   int R1 = values[0];  int R2 = values[1];  int R3 = values[2];  int R5 = values[3];  int RD2 = values[4];  int RD8 = values[5];  int M1 = values[6];  int G = values[7];  int SR = values[8];  int LC = values[9];   String[] urnR1 = new String[R1];  String[] urnR2 = new String[R2];  String[] urnR3 = new String[R3];  String[] urnR5 = new String[R5];  String[] urnRD2 = new String[RD2];  String[] urnRD8 = new String[RD8];  String[] urnG = new String[G];  String[] urnM1 = new String[M1];  String[] urnLC = new String[LC];  String[] urnSR = new String[SR];   if (R1 gt;= 0){  for (int i = 0; i lt; R1 ; i  ) {  urnR1[i] = "R1"   random9digits();  }  }  if (R2 gt;= 0){  for (int i = 0; i lt; R2 ; i  ) {  urnR2[i] = "R2"   random9digits();  }  }  if (R3 gt;= 0){  for (int i = 0; i lt; R3 ; i  ) {  urnR3[i] = "R3"   random9digits();  }  }  if (R5 gt;= 0){  for (int i = 0; i lt; R5 ; i  ) {  urnR5[i] = "R5"   random9digits();  }  }  if (RD2 gt;= 0){  for (int i = 0; i lt; RD2 ; i  ) {  urnRD2[i] = "RD2"   random9digits();  }  }  if (RD8 gt;= 0){  for (int i = 0; i lt; RD8 ; i  ) {  urnRD8[i] = "RD8"   random9digits();  }  }  if (M1 gt;= 0){  for (int i = 0; i lt; M1 ; i  ) {  urnM1[i] = "M1"   random9digits();  }  }  if (G gt;= 0){  for (int i = 0; i lt; G ; i  ) {  urnG[i] = "G"   random9digits();  }  }  if (LC gt;= 0){  for (int i = 0; i lt; LC ; i  ) {  urnLC[i] = "LC"   random9digits();  }  }  if (SR gt;= 0){  for (int i = 0; i lt; SR ; i  ) {  urnSR[i] = "SR"   random9digits();  }  }  return Arrays.stream(mergeArray(urnR1,urnR2, urnR3,urnR5, urnRD2, urnRD8, urnG, urnM1, urnLC, urnSR)).toArray(String[]::new);  }  

Комментарии:

1. Используете ли вы java 8 или выше?

2. придерживайтесь соглашений об именовании java, пожалуйста

3. Использование Java 11 @StephanHogenboom

4. @gconlon02 я опубликовал ответ, можете ли вы сказать мне, полезно ли это для вас? Если потоковый api немного сложен, его также можно переписать на циклы for

5. @StephanHogenboom Да, я закончил тем, что реализовал его через цикл for. У меня уже была плоская карта для объединения массивов. Спасибо. Вы можете увидеть мое решение выше

Ответ №1:

Я не знаю, что делает функция объединения массивов. Но я думаю, что вы можете немного оптимизировать свой код, используя приведенный ниже код:

 public static String[] randomPrefixGenerator(int[] values) {    // we can use a map to retrieve your prefixes by their index  Maplt;Integer, Stringgt; prefixNameByIndex = Map.of(  0, "R1",  1, "R2",  2, "R3",  3, "R5",  4, "RD2",  5, "RD8",  6, "M1",  7, "G",  8, "SR",  9, "LC"  );    // this stream goes through value 0 to 9  return IntStream.rangeClosed(0, 9)  // we need objects for the flatmap to work  .boxed()  // flatmap so we get a single list of strings  .flatMap(generatePrefixNamesForIndex(values, prefixNameByIndex))  .collect(Collectors.toList())  // the to array call as last  .toArray(String[]::new);   }  private static Functionlt;Integer, Streamlt;? extends Stringgt;gt; generatePrefixNamesForIndex(int[] values, Maplt;Integer, Stringgt; prefixNameByIndex) {  return index -gt; {  // we can retrieve the prefix from the map by its index  var prefixValue = prefixNameByIndex.get(index);  // retrieve te number of iterations from parameters given in the method call  return IntStream.range(0, values[index])  .mapToObj(i -gt; prefixValue   random9digits());  }; }   

Комментарии:

1. Спасибо за ваше решение. Я попробовал, и это работает, хотя я уже сам придумал подходящее решение. Еще раз спасибо.

Ответ №2:

Обновленный

В конце концов я начал думать о решении.

  private static String[] urnCounter(String[] urns){  String[] urnsProcessed = new String[Integer.parseInt(urns[0])];   if (Integer.parseInt(urns[0]) gt;= 0){  for (int j = 0; j lt; Integer.parseInt(urns[0]); j  ) {  urnsProcessed[j] = urns[1]   random9Digits();  }  }  return urnsProcessed;  }  public static String[] randomURNGenerator1(int[] values){   String[] urnR1 = urnCounter(new String[]{String.valueOf(values[0]),"R1"});  String[] urnR2 = urnCounter(new String[]{String.valueOf(values[1]),"R2"});  String[] urnR3 = urnCounter(new String[]{String.valueOf(values[2]),"R3"});  String[] urnR5 = urnCounter(new String[]{String.valueOf(values[3]),"R5"});  String[] urnRD2 = urnCounter(new String[]{String.valueOf(values[4]),"RD2"});  String[] urnRD8 = urnCounter(new String[]{String.valueOf(values[5]),"RD8"});  String[] urnG = urnCounter(new String[]{String.valueOf(values[7]),"G"});  String[] urnM1 = urnCounter(new String[]{String.valueOf(values[6]),"M1"});  String[] urnLC = urnCounter(new String[]{String.valueOf(values[9]),"LC"});  String[] urnSR = urnCounter(new String[]{String.valueOf(values[8]),"SR"});   return Arrays.stream(mergeArray(urnR1,urnR2, urnR3,urnR5, urnRD2, urnRD8, urnG, urnM1, urnLC, urnSR)).toArray(String[]::new);  }  // function to merge two arrays  @SafeVarargs  public static lt;Tgt; Object[] mergeArray(T[]... arr) {  Object[] array = Stream.of().flatMap(Stream::of).toArray();  for(T[] passedObject: arr){  array = Stream.of(array, passedObject).flatMap(Stream::of).toArray(String[]::new);  }  return array;  }