русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-06-12; просмотров: 815; Нарушение авторских прав


Сравнения, выполняемые в ходе сортировки, зависят от фактического типа объектов. Конечно, можно написать разные методы сортировки для всех возможных типов, но такой код придется модифицировать при появлении новых типов. Главной целью проектирования является «отделение того, что может измениться, от того, что остается неизменным». В данном случае неизменным остается общий алгоритм сортировки, а изменяется способ сравнения объектов. Вместо того, чтобы размещать код сравнения в разных функциях сортировки, мы воспользуемся паттерном проектирования «стратегия». В этом паттерне переменная часть кода инкапсулируется в отдельном классе. Объект стратегии передается коду, который остается неизменным, и последний использует стратегию для реализации своего алгоритма. При этом разные объекты выражают разные способы сравнения, но передаются универсальному коду сортировки. В 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 n1, int n2) {

i = n1;



j = n2;

}

public String toString() {

String result = "[i = " + i + ", j = " + j + "]";

if(count++ % 3 == 0)

result += "\n";

return result;

}

public int compareTo(CompType rv) {

return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));

}

private static Random r = new Random(47);

public static Generator<CompType> generator() {

return new Generator<CompType>() {

public CompType next() {

return new CompType(r.nextInt(100),r.nextInt(100));

}

};

}

public static void main(String[] args) {

CompType[] a =

Generated.array(new CompType[12], generator());

print("before sorting:");

print(Arrays.toString(a));

Arrays.sort(a);

print("after sorting:");

print(Arrays.toString(a));

}

}

<spoiler text="Output:">

before sorting:

[[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]

]

after sorting:

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

, [i = 20, j = 58], [i = 22, j = 7], [i = 51, j = 89]

, [i = 58, j = 55], [i = 61, j = 29], [i = 68, j = 0]

, [i = 88, j = 28], [i = 93, j = 61], [i = 98, j = 61]

]

</spoiler> Определяя метод сравнения, вы несете полную ответственность за принятие решения о его результатах. В приведенном примере в сравнении используются только значения і, а значения 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

// The Collections.reverseOrder() Comparator

import java.util.*;

import net.mindview.util.*;

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

 

public class Reverse {

public static void main(String[] args) {

CompType[] a = Generated.array(

new CompType[12], CompType.generator());

print("before sorting:");

print(Arrays.toString(a));

Arrays.sort(a, Collections.reverseOrder());

print("after sorting:");

print(Arrays.toString(a));

}

}

<spoiler text="Output:">

before sorting:

[[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]

]

after sorting:

[[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]

]

</spoiler> Наконец, вы можете написать собственную реализацию Comparator. В следующем примере объекты CompType сравниваются по значениям j вместо і:

//: arrays/ComparatorTest.java

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

import java.util.*;

import net.mindview.util.*;

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

 

class CompTypeComparator implements Comparator<CompType> {

public int compare(CompType o1, CompType o2) {

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

}

}

 

public class ComparatorTest {

public static void main(String[] args) {

CompType[] a = Generated.array(

new CompType[12], CompType.generator());

print("before sorting:");

print(Arrays.toString(a));

Arrays.sort(a, new CompTypeComparator());

print("after sorting:");

print(Arrays.toString(a));

}

}

<spoiler text="Output:">

before sorting:

[[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]

]

after sorting:

[[i = 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]

]

</spoiler>

 



<== предыдущая лекция | следующая лекция ==>
Сравнение массивов | Сортировка массива


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.686 сек.