Java: руководство для начинающих
Шрифт:
Границы массива в Java строго соблюдаются. Если границы массива не достигаются или же превышаются, при выполнении программы возникает ошибка. Для того чтобы убедиться в этом, попробуйте выполнить приведенную ниже программу, в которой намеренно превышаются границы массива. // Демонстрация превышения границ массива, class ArrayErr { public static void main(String args[]) { int sample[] = new int[10]; int i; // воссоздать превышение границ массива for(i = 0; i < 100; i = i+1) sample[i] = i; } }
Как только значение переменной i достигнет 10, будет сгенерировано исключение ArraylndexOutOfBoundsException и выполнение программы прекратится.
Пример для опробования 5.1. Сортировка массива
Как пояснялось выше, данные в одномерном массиве организованы в виде индексируемого линейного списка.
Последовательность действий
Создайте новый файл Bubble. j ava.
В алгоритме пузырьковой сортировки соседние элементы массива сравниваются и меняются, если требуется, местами. При этом малые значения сдвигаются к одному краю массива, а большие значения — к другому. Этот процесс напоминает всплывание пузырьков воздуха на разные уровни в емкости с жидкостью, откуда и произошло название данного алгоритма. Пузырьковая сортировка предполагает обработку массива в несколько проходов. Элементы, взаимное расположение которых отличается от требуемого, меняются местами. Число проходов должно быть таким, чтобы все элементы непременно встали на свои места. Максимальное количество проходов должно быть на один меньше, чем число элементов в массиве. Ниже приведен исходный код, составляющий основу алгоритма пузырьковой сортировки. Сортируемый массив называется nums. // Это пример реализации алгоритма пузырьковой сортировки. for(a=l; а < size; а++) for(b=size-l; b >= a; b—) { if(nums[b-l] > nums[b]) { // если требуемый порядок следования // не соблюдается, поменять элементы местами t = nums[b—1]; nums[b-l] = nums[b]; nums[b] = t; } } Как видите, в приведенном выше фрагменте кода используются два цикла for. Во внутреннем цикле сравниваются соседние элементы массива и выявляются элементы, находящиеся не на своих местах. Если обнаружен элемент, положение которого отличается от требуемого, то два соседних элемента меняются местами. На каждом проходе наименьший элемент передвигается на один шаг в нужное положение. Внешний цикл обеспечивает повторение описанного выше процесса до тех пор, пока сортировка массива не будет завершена.
Ниже приведен весь исходный код программы из файла Bubble. j ava. /* Пример для опробования 5.1. Демонстрация алгоритма пузырьковой сортировки. */ class Bubble { public static void main(String args[]) { int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9,, 287, 49 }; int a, b, t; int size; size = 10; // Количество элементов для сортировки // отобразить исходный массив System.out.print("Original array is:"); for(int i=0; i < size; i++) System.out.print(" " + nums[i]); System.out.println; // реализовать алгоритм пузырьковой сортировки for(a=l; а < size; а++) for(b=size-l; b >= a; b—) { if(nums[b-l] > nums[b]) { // если требуемый порядок // следования не соблюдается, поменять элементы местами t = nums[b-l]; nums[b-l] = nums[b]; nums[b] = t; } } // отобразить отсортированный массив System, out .print ("Sorted array is: "); for(int i=0; i < size; i++) System.out.print(" " + nums[i]); System.out.println; } }
Ниже приведен результат выполнения данной программы. Original array is: 99 -10 100123 18 -978 5623 463 -9 287 49 Sorted array is: -978 -10 -9' 18 49 99 287 463 5623 100123
Как упоминалось выше, пузырьковая сортировка отлично подходит для обработки мелких массивов, но при большом числе элементов массива она становится неэффективной. Более универсальным является алгоритм быстрой сортировки, но для его эффективной реализации необходимы языковые средства Java, которые рассматриваются далее в этой книге. Многомерные массивы
Несмотря на то что одномерные массивы употребляются чаще всего, в программировании, безусловно, применяются и многомерные (двух-, трехмерные и т.д.) массивы. В Java многомерные массивы представляют собой массивы массивов. Двумерные массивы
Среди многомерных массивов наиболее простыми являются двумерные массивы. Двумерный массив, по существу, представляет собой ряд одномерных массивов. Для того чтобы объявить двумерный целочисленный табличный массив table размерами 10x20, следует написать такое выражение: int tablet][] = new int[10][20];
Обратите особое внимание на объявление этого массива. В отличие от некоторых других языков программирования, где размеры массива разделяются запятыми, в Java они заключаются в отдельные квадратные скобки. Так, для обращения к элементу массива table по индексам 3 и 5 следует указать table [ 3 ] [ 5 ].
В следующем примере двумерный массив заполняется числами от 1 до 12: // Демонстрация двумерного массива, class TwoD { public static void main(String args[]) { int t, i; int table [][] = new int[3][4]; for(t=0; t < 3; ++t) { for(i=0; i < 4; ++i) { table[t][i] = (t*4)+i+l; System.out.print(table[t][i] + " "); } System.out.println ; } } }
В данном примере элемент table [0] [0] будет содержать значение 1, элемент table [0] [ 1 ] — значение 2, элемент table [0] [2] — значение 3 и так далее, а элемент table [2 ] [ 3 ] — значение 12. Структура данного массива наглядно показана на рис. 5.1.
Выделяя память под многомерный массив, достаточно указать лишь первый (крайний слева) размер. А память под остальные размеры массива можно выделять по отдельности. Например, в приведенном ниже фрагменте кода память выделяется только под первый размер двумерного массива table. А под второй его размер она выделяется вручную. int tablet][] = new int[3][]; table[0] = new int[4]; table[1] = new int[4]; table[2] = new int[4];
Объявляя массив подобным образом, мы не получаем никаких преимуществ, но в некоторых случаях такое объявление оказывается вполне оправданным. Это, в частности, дает возможность установить разную длину массива по каждому индексу. Как упоминалось выше, многомерный массив реализован в виде массива массивов, что позволяет контролировать длину каждого из них. Допустим, требуется написать программу, в процессе работы которой будет сохраняться число пассажиров, перевезенных автобусом-экспрессом в аэропорт. Если автобус-экспресс делает по десять рейсов в будние дни и по два рейса в субботу и воскресенье, то массив riders можно объявить так, как показано в приведенном ниже фрагменте кода. Обратите внимание на то, что длина массива по второму размеру для первых пяти элементов равна 10, а для двух последних элементов — 2. // Указать разную длину по второму размеру массива вручную, class Ragged { public static void main(String args[]) { int riders[][] = new int[7][]; // Для первых пяти элементов длина массива //по второму размеру равна 10. riders[0] = new int[10]; riders[1] = new int[10]; riders[2] = new int[10]; riders[3] = new int[10]; riders[4] = new int[10]; // Для остальных двух элементов длина массива //по второму размеру равна 2. riders[5] = new int[2]; riders[6] = new int[2]; int i, j; // сформировать произвольные данные for(i=0; i < 5; i++) for(j=0; j < 10; j++) riders[i][j] = i + j + 10; for(i=5; i < 7; i++) for(j=0; j < 2; j++) riders[i][j] = i + j + 10; System.out.println("Riders per trip during the week:"); for(i=0; i < 5; i++) { for(j =0; j < 10; j++) System.out.print(riders[i] [j] + " ") ; System.out.println ; } System.out.println ; System.out.println("Riders per trip on the weekend:"); for(i=5; i < 7; i++) { for (j=0; j < 2; j++) System.out.print(riders[i][j] + " "); System.out.println; } } }
Для большинства приложений использовать нерегулярные массивы не рекомендуется, поскольку это затрудняет восприятие кода другими программистами. Но в некоторых случаях такие массивы вполне уместны и могут существенно повысить эффективность программ. Так, если вам требуется создать большой двумерный массив, в котором используются не все элементы, то нерегулярный массив позволит существенно сэкономить память. Трехмерные, четырехмерные и многомерные массивы
В Java допускаются массивы размерностью больше двух. Ниже приведена общая форма объявления многомерного массива. тип имя_массива[] []...[] = new тип[размер_1] [размер_2] . . . [размер_Ы] ;