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

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

Жанры

Философия 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;

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

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

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад