Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Прежде чем обсуждать методы Arrays, следует рассмотреть еще один полезный метод, не входящий в Arrays.

Копирование массива

Стандартная библиотека Java содержит статический метод System.arraycopy, который копирует массивы значительно быстрее, чем при ручном копировании в цикле for. Метод System.arraycopy перегружен для работы со всеми типами. Пример для'массивов int:

//: arrays/CopyingArrays.java // Using System.arraycopyO

import java.util.*;

import static net.mindview.util.Print.*;

public class CopyingArrays {

public static void main(String[] args) { int[] i = new int[7]; int[] j = new int[10]; Arrays.fill(i. 47); Arrays.fill(j. 99); printC'i = " + Arrays.toString(i)); printC'j = " + Arrays.toString(j)); System.arraycopy(i. 0. j. 0. i.length); printC'j = " + Arrays.toString(j)); int[] к = new int[5]; Arrays.fill(k. 103); System.arraycopy(i. 0. к. 0. к length); printC'k = " + Arrays.toString(k)); Arrays.fill(k, 103); System.arraycopy(k, 0. i, 0, k.length); printC'i = " + Arrays.toString(i)); // Объекты:

IntegerC] u = new Integer[10];

Integer[] v = new Integer[5];

Arrays.fill(u. new Integer(47));

Arrays.fill(v. new Integer(99));

printC'u = " + Arrays.toString(u));

printC'v = " + Arrays.toString(v));

System.arraycopy(v. 0. u. u.length/2, v.length);

printC'u = " + Arrays.toString(u));

}

} /* Output:

i = [47. 47. 47. 47. 47. 47. 47] j = [99. 99. 99. 99. 99. 99. 99. 99. 99. 99] j = [47. 47. 47. 47. 47. 47. 47. 99. 99. 99] k = [47. 47. 47. 47. 47] i = [103. 103. 103. 103. 103. 47. 47] u = [47. 47. 47. 47. 47. 47. 47. 47. 47. 47] v = [99. 99. 99. 99. 99] u = [47. 47. 47. 47. 47. 99. 99. 99. 99. 99] *///:-

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

Приведенный пример показывает, что копироваться могут как примитивные, так и объектные массивы. Однако при копировании объектных массивов копируются только ссылки, но не сами объекты. Такая процедура называется поверхностным копированием.

System.arraycopy не выполняет ни автоматической упаковки, ни автоматической распаковки — типы двух массивов должны полностью совпадать.

Сравнение массивов

Класс Arrays содержит метод equals для проверки на равенство целых массивов. Метод перегружен для примитивов и Object. Чтобы два массива считались равными, они должны содержать одинаковое количество элементов, и каждый элемент должен быть эквивалентен соответствующему элементу другого массива (проверка осуществляется вызовом equals для каждой пары; для примитивов используется метод equals объектной «обертки» — например, Integer. equals для int). Пример:

// arrays/ComparingArrays java // Using Arrays equals import java.util.*;

import static net.mindview.util Print.*;

public class ComparingArrays {

public static void main(String[] args) { int[] al = new int[10]; int[] a2 = new int[10]; Arrays.filHal. 47); Arrays.fill(a2, 47); print(Arrays.equals(al, a2)); a2[3] = 11;

print(Arrays.equals(al, a2)); String[] si = new String[4]; Arrays fill(si. "Hi");

String[] s2 = { new StringC'Hi"), new StringC'Hi"),

new StringC'Hi"). new StringC'Hi") }; print(Arrays equals(sl. s2)),

}

} /* Output

true

false

true *///•-

Сначала массивы al и a2 полностью совпадают, поэтому результат сравнения равен true, но после изменения одного из элементов будет получен результат false. В последнем случае все элементы si указывают на один объект, тогда как s2 содержит пять разных объектов. Однако проверка равенства определяется содержимым (с вызовом Object.equals), поэтому результат равен true.

Сравнение элементов массивов

Сравнения, выполняемые в ходе сортировки, зависят от фактического типа объектов. Конечно, можно написать разные методы сортировки для всех возможных типов, но такой код придется модифицировать при появлении новых типов.

Главной целью проектирования является «отделение того, что может измениться, от того, что остается неизменным». В данном случае неизменным остается общий алгоритм сортировки, а изменяется способ сравнения объектов. Вместо того, чтобы размещать код сравнения в разных функциях сортировки, мы воспользуемся паттерном проектирования «стратегия». В этом паттерне переменная часть кода инкапсулируется в отдельном классе. Объект стратегии передается коду, который остается неизменным, и последний использует стратегию для реализации своего алгоритма. При этом разные объекты выражают разные способы сравнения, но передаются универсальному коду сортировки.

В Java функциональность сравнения может выражаться двумя способами. Первый основан на «естественном» методе сравнения, который включается в класс при реализации java.lang.Comparable — очень простого интерфейса с единственным методом compareTo. В аргументе метод получает другой объект того же типа. Он выдает отрицательное значение, если текущий объект меньше аргумента, нуль при равенстве и положительное значение, если текущий объект больше аргумента.

В следующем примере класс реализует Comparable, а для демонстрации совместимости используется метод стандартной библиотеки Java Arrays.sort:

//: arrays/CompType.java

// Реализация классом интерфейса Comparable.

import java.util.*;

import net.mindview.util.*;

import static net.mindview.util.Print.*;

public class CompType implements Comparable<CompType> { int i. int j;

private static int count = 1; public CompType(int nl, int n2) { i = nl; J = n2;

}

public String toStringO {

String result = "[i = " + i + J = " + j + "]"; if(count++ % 3 == 0)

result += "\n"; return result;

Поделиться:
Популярные книги

Отмороженный 13.0

Гарцевич Евгений Александрович
13. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 13.0

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Арестант

Константинов Андрей Дмитриевич
7. Бандитский Петербург
Детективы:
боевики
8.29
рейтинг книги
Арестант

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Двойник Короля 6

Скабер Артемий
6. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 6

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Контртеррор

Валериев Игорь
6. Ермак
Фантастика:
альтернативная история
5.00
рейтинг книги
Контртеррор

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX