Вывод значений пираммидой

162
11 июня 2018, 14:50

Столкнулся с такой проблемой, нужно организовать на сайте вывод данных в ввиде пираммиды, по принцыпу:

   1
  1 1
 1 1 1
1 1 1 1
 1 1 1
1 1 1 1

Проблема в том что все данные уникальны, пробовал выводить через ArrayList - ничего не получается т.к. три верхних значения не влезают в цикл. Может кто-то сталкивался с такой проблемой?

for (int i = 0; i < 1; i++) {
        System.out.println(" " + " " + " " + list.get(0) + " " + " " + " ");
        System.out.println(" " + " " + list.get(1) + " " + list.get(2) + " " + " ");
    }

Это черновой вывод трех первых значений. Но как впихнуть это в цикл вывода остальных значений (или как остальные значения подвязать сюда) - я не знаю.

Answer 1

если продолжить вашу мысль может так:

System.out.println("   " + list.get(0));
System.out.println("  " + list.get(1) + " " + list.get(2));
for (int i = 3, end = list.size();i < end;) {
    System.out.println(" " + list.get(i++) + " " + list.get(i++) + " " + list.get(i++));
    System.out.println(list.get(i++) + " " + list.get(i++) + " " + list.get(i++) + " " + list.get(i++));
}

Это если совсем просто, но работать будет только при условии что у вас в списке гарантированно 3 + 7n элементов. Если это условие не выполняется, то логику придётся немного усложнить. Да и пирамида будет стройной только при условии, что элемент содержит 1 символ.

Answer 2

Описал решение с любым количеством данных, но стройная будет пирамида только при содержании элементов с длиной в один символ.
Для стройности с любыми данными, необходимо откорректировать метод вывода. Но тогда Вам необходимо будет продумать логику.
Представленный мною код сейчас генерирует n <= 10 количество списков с n <= 50 количеством элементов:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;
    public class Pyramid {
        public static void main(String[] args) {
            process(generateSourceList());
        }
        private static List<List<String>> generateSourceList() {
            List<List<String>> sources = new ArrayList<>();
            int countSources = new Random().nextInt(10) + 1;
            for (int i = 0; i < countSources; i++) {
                List<String> source = new ArrayList<>();
                int countSource = new Random().nextInt(50) + 1;
                System.out.println("Сгенерирован источник с " + countSource + " элементами");
                for (int cs = 0; cs < countSource; cs++) {
                    source.add("1");
                }
                sources.add(source);
            }
            System.out.println("Сгенерировано: " + countSources + " источников");
            return sources;
        }
        private static void process(List<List<String>> sources) {
            for (List<String> list : sources) {
                System.out.println("==============================");
                System.out.println("Вывод пирамиды из " + list.size() + " элементов");
                System.out.println("==============================");
                printPyramidData(
                        createPyramidDataFromList(list)
                );
                System.out.println();
            }
        }
        private static PyramidData createPyramidDataFromList(List<String> data) {
            int beginSubstr = 0;
            List<List<String>> listRows = new ArrayList<>();
            int maxLen = 0;
            for (int i = 0; i < data.size(); i++) {
                int step = i + 1;
                if (beginSubstr + step < data.size()) {
                    List<String> row = data.subList(beginSubstr, beginSubstr + step);
                    maxLen = row.size() > maxLen ? row.size() : maxLen;
                    listRows.add(row);
                    beginSubstr = beginSubstr + step;
                } else {
                    System.out.println("Лишние элементы: " +
                            Arrays.toString(
                                    data.subList(beginSubstr, data.size())
                                            .toArray()
                            )
                    );
                    break;
                }
            }
            System.out.println("Получено: " + listRows.size() + " строк");
            return new PyramidData(listRows, maxLen);
        }
        private static void printPyramidData(PyramidData pyramidData) {
            int maxLenWithSpace = pyramidData.maxLen() + (pyramidData.maxLen() - 1);
            for (List<String> list : pyramidData.data()) {
                int listSize = list.size();
                int startPost = (maxLenWithSpace - (listSize + (listSize - 1))) / 2;
                for (int l = 0; l < maxLenWithSpace; l++) {
                    if (l == startPost) {
                        for (int s = 0; s < listSize; s++) {
                            String val = list.get(s);
                            if (s == (listSize - 1)) {
                                System.out.print(val);
                            } else {
                                System.out.print(val + " ");
                            }
                        }
                    } else {
                        if (l == (maxLenWithSpace - 1)) {
                            System.out.println(" ");
                        } else {
                            System.out.print(" ");
                        }
                    }
                }
            }
        }
    }
    class PyramidData {
        private List<List<String>> data;
        private int maxLen;
        PyramidData(List<List<String>> data, int maxLen) {
            this.data = data;
            this.maxLen = maxLen;
        }
        List<List<String>> data() {
            return data;
        }
        int maxLen() {
            return maxLen;
        }
    }
READ ALSO
Запись и чтение файлов в общую внутреннюю память устройства

Запись и чтение файлов в общую внутреннюю память устройства

Подскажите пожалуйста как записать или прочитать файл из общей внутренней памяти устройства (storage/emulated/0)? Где указывать путь? Если можно,...

151
Проблема паузы (?)

Проблема паузы (?)

Нужно, что бы автоматически вывелся текст в TextView, а по прошествию паузы он изменилсяУ меня так:

214
Ошибка заполнения RecyclerView

Ошибка заполнения RecyclerView

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

207