#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; }