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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

String[] sa = Generated.array(new String[20],

new RandomGenerator String(5)), print("Before sort. " + Arrays toString(sa)); Arrays sort(sa);

print("After sort. " + Arrays toString(sa)), Arrays.sort(sa, Collections reverseOrder); print("Reverse sort. " + Arrays toString(sa)); Arrays sort(sa, String CASE_INSENSITIVE_ORDER). print("Case-insensitive sort- " + Arrays toString(sa));

}

} /* Output-

Before sort [YNzbr. nyGcF, OWZnT, cQrGs, eGZMm, JMRoE, suEcU, OneOE, dLsmw, HLGEa,

hKcxr, EqUCB. bklna, Mesbt, WHkjU. rUkZP, gwsqP, zDyCy, RFJQA, HxxHv]

After sort- [EqUCB, HLGEa. HxxHv. JMRoE. Mesbt, OWZnT, OneOE, RFJQA, WHkjU, YNzbr,

bklna, cQrGs, dLsmw, eGZMm, gwsqP, hKcxr, nyGcF, rUkZP. suEcU. zDyCy]

Reverse sort: [zDyCy. suEcU, rUkZP, nyGcF. hKcxr, gwsqP, eGZMm, dLsmw. cQrGs, bklna.

YNzbr. WHkjU, RFJQA, OneOE, OWZnT, Mesbt. JMRoE. HxxHv, HLGEa, EqUCB]

Case-insensitive sort, [bklna. cQrGs. dLsmw, eGZMm, EqUCB, gwsqP, hKcxr, HLGEa, HxxHv,

JMRoE. Mesbt. nyGcF, OneOE. OWZnT. RFJQA. rUkZP. suEcU. WHkjU. YNzbr. zDyCy] *///.-

В выходных данных алгоритма сортировки String бросается в глаза то, что алгоритм является лексикографическим, то есть все слова, начинающиеся с прописных букв, предшествуют любым словам, начинающимся со строчных букв. Если вы хотите, чтобы слова группировались независимо от регистра символов, используйте режим String.CASE_INSENSITIVE_ORDER, как показано в последнем вызове sort из приведенного примера.

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

Поиск в отсортированном массиве

После того, как массив будет отсортирован, вы сможете быстро найти нужный элемент методом Arrays.binarySearchQ. Попытка вызова binarySearchQ для несортированного массива приведет к непредсказуемым последствиям. В следующем примере генератор RandomGenerator.Integer заполняет массив, после чего тот же генератор используется для получения искомых значений:

//. arrays/ArraySearching java

// Using Arrays binarySearch

import java util *;

import net.mindview util *;

import static net mindview.util Print *.

public class ArraySearching {

public static void main(String[] args) { Generator<Integer> gen =

new RandomGenerator.Integer(1000). int[] a = ConvertTo primitive(

Generated.array(new Integer[25], gen)). Arrays sort(a).

ргШСОтсортированный массив: " + Arrays toString(a)). while(true) {

int r = gen.nextO.

int location = Arrays binarySearch(a, r). if(location >= 0) {

pnnt("Значение " + r + " находится в позиции " +

location +

a[" + location + "] = " + a[location]); break. // Выход из цикла while

}

} /* Output

Отсортированный массив- [128. 140. 200. 207. 258. 258. 278. 288, 322. 429. 511. 520.

522. 551. 555. 589. 693. 704. 809. 861. 861. 868. 916. 961. 998]

Значение 322 находится в позиции 8. а[8] = 322

*/// ~

Цикл while генерирует случайные значения как искомые до тех пор, пока одно из них не будет найдено в массиве.

Если искомое значение найдено, метод Arrays.binarySearchQ возвращает неотрицательный результат. В противном случае возвращается отрицательное значение, представляющее позицию элемента при вставке (при сохранении сортировки массива). Если массив содержит повторяющиеся значения, алгоритм поиска не дает гарантий относительно того, какой именно из дубликатов будет обнаружен. Алгоритм проектировался не для поддержки дубликатов, а для того, чтобы переносить их присутствие. Если вам нужен отсортированный список без повторений элементов, используйте TreeSet (для сохранения порядка сортировки) или LinkedHashSet (для сохранения порядка вставки). Эти классы автоматически берут на себя все детали. Только в ситуациях, критичных по быстродействию, эти классы заменяются массивами с ручным выполнением операций.

При сортировке объектных массивов с использованием Comparator (примитивные массивы не позволяют выполнять сортировку с Comparator) необходимо включать тот же объект Comparator, что и при использовании binarySearch (перегруженной версии). Например, программу StringSorting.java можно модифицировать для выполнения поиска:

//• arrays/AlphabeticSearch.java // Поиск с Comparator, import java.util.*; import net.mindview.util.*;

public class AlphabeticSearch {

public static void main(String[] args) {

String[] sa = Generated.array(new String[30],

new RandomGenerator String(5)); Arrays.sort(sa. String.CASE_INSENSITIVE_ORDER); System.out.pri ntln(Arrays.toStri ng(sa)); int index = Arrays.binarySearch(sa. sa[10],

Stri ng. CASE JNSENSITI VE_0RDER); System.out.printlпС'Индекс: "+ index + "\n"+ sa[index]);

}

} /* Output

[bklna. cQrGs. cXZJo. dLsmw. eGZMm. EqUCB. gwsqP. hKcxr, HLGEa. HqXum, HxxHv, JMRoE. JmzMs. Mesbt, MNvqe, nyGcF, ogoYW, OneOE. OWZnT. RFJQA. rUkZP. sgqia, slJrL, suEcU. uTpnX, vpfFv, WHkjU. xxEAJ, YNzbr, zDyCy] Индекс 10 HxxHv *///.-

Объект Comparator передается перегруженному методу binarySearch в третьем аргументе. В приведенном примере успех поиска гарантирован, так как искомое значение выбирается из самого массива.

Резюме

В этой главе вы убедились в том, что язык Java предоставляет неплохую поддержку низкоуровневых массивов фиксированного размера. Такие массивы отдают предпочтение производительности перед гибкостью. В исходной версии Java низкоуровневые массивы фиксированного размера были абсолютно необходимы — не только потому, что проектировщики Java решили включить в язык примитивные типы (также по соображениям быстродействия), но и потому, что поддержка контейнеров в этой версии была крайне ограниченной.

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

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Ваантан

Кораблев Родион
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваантан

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Шайтан Иван 2

Тен Эдуард
2. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван 2

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

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

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Деревенщина в Пекине

Афанасьев Семён
1. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине

Старый, но крепкий 4

Крынов Макс
4. Культивация без насилия
Фантастика:
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 4

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

Сирийский рубеж

Дорин Михаил
5. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1