Регистрация  |  Вход

Разбиваем массив на части

Небольшой челенж, кому интересно немного размять мозги.

интересная задачка попалась сегодня, вот решил поделиться. Будет интересно увидеть как вы решите это и сравнить со своим вариантом.

Есть массив чего-нибудь, к примеру ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']. надо разбить на 3 колонки.
Чтобы получилось что-то типа такого:

a e h
b f i
c g j
d
Короче выглядит это как будто заполняется по горизонтали, но на самом деле значения идут по вертикали - заполнятся первая колонка, потом вторая, потом третья.

Массив может быть любой длины, колонки путь будут 3, но в идеале тоже динамическое значение.
Небольшой челенж, кому интересно немного размять мозги.

интересная задачка попалась сегодня, вот решил поделиться. Будет интересно увидеть как вы решите это и сравнить со своим вариантом.

Есть массив чего-нибудь, к примеру ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']. надо разбить на 3 колонки. 
Чтобы получилось что-то типа такого:

a e h
b f i
c g j
d
Короче выглядит это как будто заполняется по горизонтали, но на самом деле значения идут по вертикали - заполнятся первая колонка, потом вторая, потом третья.

Массив может быть любой длины, колонки путь будут 3, но в идеале тоже динамическое значение.
Dmitry Shnyrev
олучилось что-то типа

Это простое преобразование из линейного в двумерный насколько я понимаю
[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;
не проверял , написал тут в сообщении

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]
Предложу свой вариант. Не судите строго алгоритмам не обучен, математику не знаю Решение для 3-х колонок, при желании можно модифицировать для N.

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]

Предлагаю довести данный алгоритм до совершенства