Читаем Философия Java3 полностью

Определяя метод сравнения, вы несете полную ответственность за принятие решения о его результатах. В приведенном примере в сравнении используются только значения i, а значения j игнорируются.

Метод generator() производит объект, реализующий интерфейс Generator, создавая анонимный внутренний класс. Объект строит объекты CompType, инициализируя их случайными значениями. В main() генератор заполняет массив CompType, который затем сортируется. Если интерфейс Comparable не реализован, то при попытке вызова sort() произойдет исключение ClassCastException. Это объясняется тем, что sort() преобразует свой аргумент к типу Comparable.

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

Класс Collections содержит метод reverseOrder(), который создает Comparator для порядка сортировки, обратного по отношению к естественному. Он может быть применен к CompType:

//: arrays/Reverse.java

// Метод Col lections.reverseOrderO

import java util *;

i mport net.mi ndvi ew.uti1.*,

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

public class Reverse {

public static void main(String[] args) { CompTypeC] a = Generated.array(

new CompType[12], CompType generatorO); print("перед сортировкой "); print(Arrays.toString(a)). Arrays.sort(a. Col lections. reverseOrderO). print("после сортировки:"); pri nt(Arrays.toStri ng(a));

} /* Output: перед сортировкой:

[[i = 58. j = 55]. [i = 93. j = 61]. [i =61. j = 29] . [i = 68. j = 0]. [i = 22. j = 7]. [i - 88. j - 28] . [i = 51. j = 89]. [i = 9. j = 78]. [i = 98. j = 61]

. [i = 20. j = 58]. [i =16. j = 40]. [i - 11. j - 22] ]

после сортировки:

[[i - 98. j - 61]. [i =93. j = 61]. [i =88. j = 28] . [i = 68. j = 0]. [i = 61. j = 29]. [i = 58. j = 55] . [i = 51. j = 89]. [i = 22. j = 7]. [i = 20. j = 58]

. [i = 16. j = 40]. [i = 11. j = 22]. [i = 9. j = 78] ]

*///:-

Наконец, вы можете написать собственную реализацию Comparator. В следующем примере объекты CompType сравниваются по значениям]' вместо i:

//: arrays/ComparatorTest.java

// Реализация Comparator

import java.util.*:

import net.mindview.util.*:

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

class CompTypeComparator implements Comparator { public int compare(CompType ol. CompType o2) {

return (ol.j < o2.j ? -1 : (ol.j == o2.j ? 0 : 1)):

}

}

public class ComparatorTest {

public static void main(String[] args) { CompTypeC] a = Generated.array(

new CompType[12], CompType.generatorO); print("перед сортировкой:"): print(Arrays.toString(a)): Arrays.sort(a. new CompTypeComparatorO); print("после сортировки:"): print(Arrays.toString(a));

}

} /* Output: перед сортировкой:

[[i = 58. j = 55]. [i = 93. j = 61]. [i = 61. j = 29] . [i = 68. j = 0]. [i = 22. j = 7]. [i = 88. j = 28] . [i = 51. j = 89]. [i = 9. j = 78]. [i = 98. j = 61]

. [i = 20. j = 58]. [i = 16. j = 40]. [i = 11. j = 22] ]

после сортировки:

[[1 = 68. j = 0]. [i = 22. j = 7]. [i - 11. j - 22]

. [i = 88. j = 28]. [i = 61. j = 29]. [i = 16. j = 40]

. [i = 58. j = 55]. [i = 20. j = 58]. [i = 93. j = 61]

. [i = 98. j = 61]. [i = 9. j = 78]. [i = 51. j = 89] ]

Сортировка массива

Встроенные средства сортировки позволяют отсортировать любой массив примитивов, любой массив объектов, реализующих Comparable или ассоциированных с объектом Comparator1. Следующий пример генерирует случайные объекты String и сортирует их:

//: arrays/StringSorting.java // Sorting an array of Strings, import java.util *; import net.mindview.util.*, import static net.mindview.util.Print *; public class StringSorting {

public static void main(String[] args) {

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]

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных