Философия Java3
Шрифт:
Векторы массивов, образующих матрицу, могут иметь разную длину (это называется ступенчатым массивом):
//: arrays/RaggedArray java import java util *;
public class RaggedArray {
public static void main(Stnng[] args) { Random rand = new Random(47), // Трехмерный массив с векторами переменной длины int[][][] а = new int[гаnd.nextInt(7)][][]; for(int i =0. i < a length. i++) {
a[i] = new int[rand nextlnt(5)][]. for(int j = 0. j < a[i] length. j++)
a[i][j] = new int[rand nextlnt(5)].
}
System.out println(Arrays deepToString(a)),
}
} /* Output-
[[]. [[0]. [0]. [0. 0. 0. 0]]. [[]. [0. 0]. [0. 0]]. [[0. 0. 0]. [0]. [0. 0. 0. 0]]. [[0. 0. 0], [0. 0. 0]. [0]. []]. [[0]. []. [0]]] */// ~
Первая
Массивы с не-примитивными элементами заполняются аналогичным образом. Пример объединения нескольких выражений new в фигурных скобках:
//• arrays/MultidimensionalObjectArrays java import java.util *;
public class MultidimensionalObjectArrays { public static void main(String[] args) { BerylliumSphere[][] spheres = {
{ new Beryl liumSphereO, new Beryl liumSphereO }. { new Beryl 1 iumSphereO, new Beryl 1 iumSphereO .
new Beryl liumSphereO. new Beryl liumSphereO }, { new Beryl liumSphereO. new Beryl liumSphereO.
new Beryl li umSphereO. new Beryl liumSphereO , new BerylliumSphereO, new Beryl 1iumSphere. new Beryl liumSphereO. new Beryl liumSphereO }.
}:
System out.printin(Arrays.deepToStri ng(spheres));
}
} /* Output:
[[Sphere 0. Sphere 1]. [Sphere 2, Sphere 3. Sphere 4, Sphere 5]. [Sphere 6. Sphere 7. Sphere 8. Sphere 9. Sphere 10. Sphere 11. Sphere 12. Sphere 13]] *///:-
Массив spheres также является ступенчатым, то есть длины вложенных списков объектов различаются.
Механизм автоматической упаковки работает с инициализаторами массивов:
//• arrays/AutoboxingArrays.java import java util *.
public class AutoboxingArrays {
public static void main(String[] args) {
Integer[][] a = { // Автоматическая упаковка
{ 1, 2. 3. 4, 5, 6. 7. 8, 9, 10 }, продолжение #
{ 21. 22, 23, 24, 25, 26. 27. 28. 29. 30 }. { 51. 52. 53. 54, 55. 56. 57. 58. 59. 60 }. { 71. 72. 73. 74, 75. 76. 77. 78. 79. 80 }.
}.
System.out.pri ntlл(Arrays.deepToStri ng(a));
}
} /* Output-
[[1. 2, 3. 4. 5. 6. 7. 8. 9. 10]. [21. 22. 23. 24. 25. 26. 27. 28. 29. 30]. [51. 52. 53.
54. 55. 56. 57. 58. 59, 60], [71, 72, 73, 74. 75. 76. 77. 78. 79. 80]] *///-
А
//. arrays/AssemblingMultidimensionalArrays.java // Создание многомерных массивов import java util.*;
public class AssemblingMultidimensionalArrays { public static void main(String[] args) { Integer[][] a. a = new Integer[3][]; for(int i = 0; i < a.length; i++) { a[i] = new Integer[3], for(int j = 0; j < a[i] length; j++)
a[i][j] = i * j; // Автоматическая упаковка
}
System.out println(Arrays.deepToString(a));
}
} /* Output.
[[0, 0, 0]. [0. 1. 2]. [0. 2. 4]] *///:-
Выражение i*j присутствует только для того, чтобы поместить менее тривиальное значение в Integer.
Метод Arrays.deepToString работает как с массивами примитивных типов, так и с массивами объектов:
//: arrays/MultiDimWrapperArray.java // Multidimensional arrays of "wrapper" objects, import java util *;
public class MultiDimWrapperArray {
public static void main(Str*ing[] args) {
Integer[][] al = { // Автоматическая упаковка { 1. 2. 3. }. { 4. 5. 6, }.
}.
Double[][][] a2 = { // Автоматическая упаковка { { 1.1. 2 2 }. { 3 3. 4.4 } }. { { 5.5, 6.6 }. { 7.7, 8 8}}, { { 9.9, 1 2 }. { 2.3, 3 4}},
}.
string:::: аз = {
{ "The", "Quick", "Sly", "Fox" }, { "Jumped". "Over" }.
{ "The". "Lazy". "Brown", "Dog", "and", "friend" },
System.out.printiл("al: " + Arrays.deepToString(al)): System.out.printiл("a2: " + Arrays.deepToString(a2)): System.out.printin("a3: " + Arrays.deepToString(a3)):
}
} /* Output:
al: [[1. 2. 3], [4. 5. 6]]
a2: [[[1.1. 2.2], [3.3. 4.4]]. [[5.5. 6.6], [7.7. 8.8]]. [[9.9. 1.2]. [2.3. 3.4]]] a3: [[The, Quick. Sly. Fox], [Jumped, Over], [The. Lazy. Brown. Dog. and. friend]] *///:-
И снова в массивах Integer и Double механизм автоматической упаковки Java SE5 создает необходимые объекты-«обертки».
Массивы и параметризация
В общем случае массивы и параметризация плохо сочетаются друг с другом. Например, массивы не могут инициализироваться параметризованными типами:
Peel<Banana>[] peels = new Peel<Banana>[10]: II He разрешено
Стирание удаляет информацию о параметре типа, а массив должен знать точный тип хранящихся в нем объектов для обеспечения безопасности типов. Впрочем, параметризовать можно сам тип массива:
//: arrays/ParameterizedArrayType.java
class ClassParameter<T> {
public T[] f(T[] arg) { return arg: }
}
class MethodParameter {
public static <T> T[] f(T[] arg) { return arg; }