Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка и вывод двумерного массива, Оптимальное решение 
:(
    Опции темы
Kizja
Дата 15.4.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Привет, столкнулся с проблемой грамотной сортировки и вывода двойного массива на экран...

Вывод должен быть следующим:

          X1   X2  X3  X4  X5   SUM
Y1       0     1    2    3    4     10
Y2       5     6    7    8    9     35
Y3      10   11   12  13   14    60
Y4      15   16   17  18   19    85
Y5      20   21   22  23   24   110
SUM    50   55   60  65  70

Условия такие, что как горизонтальные, так и вертикальные ряды можно менять местами, т.е. начальная таблица имеет последовательность X1  X2  X3  X4  X5 и Y1  Y2  Y3  Y4  Y5, но они могут менять свои места...

Написал следующий, на мой взгляд, не самый лучший вариант:

Код

import java.util.LinkedList;
import java.util.List;


public class Table {
    private int[][] table;
    private List<Row> verticalRows = new LinkedList<Row>();
    private List<Row> horizontalRows = new LinkedList<Row>();

    public Table(int[][] table) {
        this.table = table;
        init();
    }
    
    private void init() {
        for (int i = 0; i < table.length; i++) {
            for (int j = 0; j < table[i].length; j++) {
                int value = table[i][j];
                update(horizontalRows, i, value);
                update(verticalRows, j, value);
            }
        }
    }

    private void update(List<Row> rows, int index, int value) {
        if (rows.size() <= index) {
            rows.add(new Row(index, value));
        } else {
            rows.get(index).sum += value;
        }
    }

    public void rotateVerticalRows(int first, int second) {
        rotate(verticalRows, first, second);
    }
    
    public void rotateHorizontalRows(int first, int second) {
        rotate(horizontalRows, first, second);
    }
    
    private void rotate(List<Row> rows, int first, int second) {
        Row temp = rows.get(first);
        rows.set(first, rows.get(second));
        rows.set(second, temp);
    }
    
    public void print() {
        System.out.print("  ");
        for (int i = 0; i < verticalRows.size(); i++) {
            System.out.print(verticalRows.get(i).index + " ");
        }
        System.out.println();
        for (int i = 0; i < horizontalRows.size(); i++) {
            for (int j = 0; j < verticalRows.size(); j++) {
                if (j == 0) {
                    System.out.print(horizontalRows.get(i).index + " ");
                }
                int value = table[horizontalRows.get(i).index][verticalRows.get(j).index];
                System.out.print(value + " ");
                if (j == verticalRows.size() - 1) {
                    System.out.print(horizontalRows.get(i).sum);
                }
            }
            System.out.println();
        }
        System.out.print("  ");
        for (int i = 0; i < verticalRows.size(); i++) {
            System.out.print(verticalRows.get(i).sum + " ");
        }
    }
    
    private class Row {
        private int index;
        private int sum;
        
        private Row(int index, int sum) {
            this.index = index;
            this.sum = sum;
        }
    }
}


Код

public class Main {
    private static final int[][] DATA = new int[][]{
        {1, 0, 0, 0, 0},
        {0, 1, 0, 1, 1},
        {0, 1, 0, 1, 1},
        {1, 1, 0, 1, 0},
        {0, 0, 1, 0, 1},
        {0, 1, 1, 1, 1}
    };
    
    public static void main(String[] args) {
        Table table = new Table(DATA);
        table.rotateHorizontalRows(0, 3);
        table.rotateVerticalRows(0, 4);
        table.print();
    }
}


Кто-нибудь в состоянии предложить более грамотный вариант ? Особенно недоволен методом print(), который как-то совсем покорявому выполняет свою задачу...

Данные не обязаны быть в двумерном массиве int[][], а могут иметь какой либо другой формат - главная задача в том, чтобы имелась возможность смены колонок и учёт изменения их индексации и суммы колонок...

Это сообщение отредактировал(а) Kizja - 15.4.2010, 18:24
PM MAIL   Вверх
MaxPayneC
Дата 15.4.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Что есть и что нужно сделать?
PM   Вверх
jk1
Дата 15.4.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Работает для квадратных матриц, на прямоугольные легко обобщается
Код

public class test {
    static int[][] sampleInput = new int[][]{
            {1, 4, 12, 6, 4},
            {125, 1, 7, 34, 6},
            {2, 9, 4, 2, 8},
            {63, 65, 32, 9, 0},
            {0, 0, 4, 5, 3}};

    public static void main(String[] args) {
        int[] holder = new int[sampleInput.length * sampleInput.length];
        int top = 0;
        for (int[] row : sampleInput) {
            System.arraycopy(row, 0, holder, top, row.length);
            top += row.length;
        }
        Arrays.sort(holder);
        for (int i = 0; i < sampleInput.length; i++) {
            int sum = 0;
            int offset = i * sampleInput.length;
            for (int j = 0; j < sampleInput.length; j++) {
              System.out.print(holder[offset + j]+" ");
              sum+=holder[offset + j];  
            }
            System.out.println(" Sum: " + sum);
        }
    }
}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Kizja
Дата 15.4.2010, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



jk1, твой вариант, если я не ошибаюсь, не соответствует условиям задачи... он просто вроде сортирует элементы, в данной задаче рассматривается ряд как единое целое...

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

Изначально может быть любой массив, но предположим, что он такой:


         0  1   2  3   4
      ==============
0    | 11 12 13 14 15 |
1    | 21 22 23 24 25 |
2    | 31 32 33 34 35 |
3    | 41 42 43 44 45 |
4    | 51 52 53 54 55 |
5    | 61 62 63 64 65 |
      ==============

(0..4 и 0..5 индексы вертикальных и горизонтальных колонок)

задаётся допустим что хотим:

а) поменять местами горизонтальные колонки с индексами 0 и 3
б) поменять местами вертикальные колонки с индексами 0 и 4

Код

table.rotateHorizontalRows(0, 3);
table.rotateVerticalRows(0, 4);


т.е. меняются местами горизонтальные элементы:

11 12 13 14 15 и 41 42 43 44 45

получается такое:

41 42 43 44 45
21 22 23 24 25
31 32 33 34 35
11 12 13 14 15
51 52 53 54 55
61 62 63 64 65

и меняются вертикальные элементы:

41       45
21       25
31       35
11   и   15
51       55
61       65

получается в итоге такое:

45 42 43 44 41
25 22 23 24 21
35 32 33 34 31
15 12 13 14 11
55 52 53 54 51
65 62 63 64 61

Кроме того, что поменяли надо учитывать начальные индексы и расчитывать сумму рядов, т.е. вывод будет такой:

          4   1    2    3   0      SUM
        ==============
3     | 45  42  43  44  41 |   215
1     | 25  22  23  24  21 |   115
2     | 35  32  33  34  31 |   165
0     | 15  12  13  14  11 |    65
4     | 55  52  53  54  51 |   265
5     | 65  62  63  64  61 |   216
        ==============
SUM 240 222 228 234 216

Тот вариант, что привёл я в прошлом сообщении работает правильно, но он корявый...

Это сообщение отредактировал(а) Kizja - 15.4.2010, 19:54
PM MAIL   Вверх
MaxPayneC
Дата 15.4.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Мне кажется, ваш подход оптимален для этой задачи. Единственное что, я бы суммы не хранил. А в целом поход зависит от того, зачем вам это надо - если нужно часто выводить результат и пересчет будет занимать много времени - тогда не хранить, а пересчитывать суммы.
Если не секрет, зачем вам такие операции с матрицей?
PM   Вверх
_Y_
Дата 15.4.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Поскольку тема не в алгоритмах, а в Java, думаю не грех упоминуть про Arrays.sort. Дописать соответстующий Comparator. А потом только сортировать в разных направлениях транспонируя матрицу туда-сюда.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Kizja
Дата 15.4.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



MaxPayneC, Да не, не секрет - в университете надо реализовать алгоритм, если интересно, то вот здесь презентация в PowerPoint о том, как он должен работать: http://maurus.ttu.ee/ained/IDN5590_K10/doc/3/pluss.zip

Я уже реализовал и правильно работает, но у меня не было предусмотрено программой вывод индексов элементов и их суммы - и никак теперь не придумать, как нормально переделать... получается какое-то извращение smile

Если интересно, то могу в принципе выложить программу (строчек 200 кода), хотя врядли у вас есть желание вникать...

Могу в принципе на###кодить, но не хотелось бы... поэтому и создал эту тему

Это сообщение отредактировал(а) Kizja - 15.4.2010, 23:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.