Небольшой челенж, кому интересно немного размять мозги. интересная задачка попалась сегодня, вот решил поделиться. Будет интересно увидеть как вы решите это и сравнить со своим вариантом. Есть массив чего-нибудь, к примеру ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']. надо разбить на 3 колонки. Чтобы получилось что-то типа такого: a e h b f i c g j d Короче выглядит это как будто заполняется по горизонтали, но на самом деле значения идут по вертикали - заполнятся первая колонка, потом вторая, потом третья. Массив может быть любой длины, колонки путь будут 3, но в идеале тоже динамическое значение.
[quote="Dmitry Shnyrev"]олучилось что-то типа [/quote] Это простое преобразование из линейного в двумерный насколько я понимаю
Ну хз как это называется по научному. Да и во всяких алгоритмах я не силен. Никогда не любил читать заумные книги про всякие лучшие алгоритмы и прочую теоретическую чушь. Я просто предлагаю решить это в лоб :smiley:
не проверял , написал тут в сообщении Z изначальный массив X длина изначального массива Z N число колонок в новой матрице y=X/N; list<list<integer>> ans; for(integer t=0;t++;t<y+1){ list<integer> temp = new list<integer>; for(integer g=t;g+=y;g<=X){ temp.add(Z[g]); } ans.add(temp); } return ans;
Integer N = 3; List<String> z = new List<String>{'a', 'b', 'c', 'd', 'f', 'g', 'e'}; Integer x = z.size(); Integer y = x/N; System.debug(N+','+x+','+y); List<List<String>> ans = new List<List<String>>(); for(Integer t=0;t<y+1;t++){ List<String> temp = new List<String>(); for(Integer g=t;g<=x;g+=y){ temp.add(z[g]); } ans.add(temp); } SYSTEM.DEBUG(ans);
[quote="Андрей"]не проверял , написал тут в сообщении[/quote] С твоего позволения набрал твой код чтобы он запускался, но что-то пока падает. Если есть желание, давай доведем до рабочего варианта :smile: [code] Integer N = 3; List<String> z = new List<String>{'a', 'b', 'c', 'd', 'f', 'g', 'e'}; Integer x = z.size(); Integer y = x/N; System.debug(N+','+x+','+y); List<List<String>> ans = new List<List<String>>(); for(Integer t=0;t<y+1;t++){ List<String> temp = new List<String>(); for(Integer g=t;g<=x;g+=y){ temp.add(z[g]); } ans.add(temp); } SYSTEM.DEBUG(ans); [/code]
Integer partSize = Integer.valueOf((Decimal.valueOf(payments.size()) / 3).round(System.RoundingMode.DOWN)); paymentsColsN = new List<Integer>{ partSize, partSize, partSize }; for (Integer i = 0; i < payments.size() - partSize * 3; i++) { paymentsColsN[i]++; } Integer n = 0; for (Integer i = 0; i < 3; i++) { paymentsCols.add(new List<PaymentDTO>()); for (Integer j = 0; j < paymentsColsN[i]; j++) { Invoice_Payment__c sp = payments[n]; paymentsCols[i].add( new PaymentDTO(sp) ); totalPaid += sp.Amount__c; n++; } } paymentsCol1 = paymentsCols[0]; paymentsCol2 = paymentsCols[1]; paymentsCol3 = paymentsCols[2];
Предложу свой вариант. Не судите строго :rolling: алгоритмам не обучен, математику не знаю :party: Решение для 3-х колонок, при желании можно модифицировать для N. [code] Integer partSize = Integer.valueOf((Decimal.valueOf(payments.size()) / 3).round(System.RoundingMode.DOWN)); paymentsColsN = new List<Integer>{ partSize, partSize, partSize }; for (Integer i = 0; i < payments.size() - partSize * 3; i++) { paymentsColsN[i]++; } Integer n = 0; for (Integer i = 0; i < 3; i++) { paymentsCols.add(new List<PaymentDTO>()); for (Integer j = 0; j < paymentsColsN[i]; j++) { Invoice_Payment__c sp = payments[n]; paymentsCols[i].add( new PaymentDTO(sp) ); totalPaid += sp.Amount__c; n++; } } paymentsCol1 = paymentsCols[0]; paymentsCol2 = paymentsCols[1]; paymentsCol3 = paymentsCols[2]; [/code] Предлагаю довести данный алгоритм до совершенства