русс | укр

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

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

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

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


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

Вспомогательный класс Set


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


Рассмотрим еще один пример использования параметризованных методов: математические операции между множествами. Эти операции удобно определить в виде параметризованных методов, используемых с различными типами:

//: net/mindview/util/Sets.java

package net.mindview.util;

import java.util.*;

 

public class Sets {

public static <T> Set<T> union(Set<T> a, Set<T> b) {

Set<T> result = new HashSet<T>(a);

result.addAll(b);

return result;

}

public static <T>

Set<T> intersection(Set<T> a, Set<T> b) {

Set<T> result = new HashSet<T>(a);

result.retainAll(b);

return result;

}

// Вычитание подмножества из надмножества

public static <T> Set<T>

difference(Set<T> superset, Set<T> subset) {

Set<T> result = new HashSet<T>(superset);

result.removeAll(subset);

return result;

}

// Дополнение -- все. что не входит в пересечение

public static <T> Set<T> complement(Set<T> a, Set<T> b) {

return difference(union(a, b), intersection(a, b));

}

}

Первые три метода дублируют первый аргумент, копируя его ссылки в новый объект HashSet, поэтому аргументы Set не изменяются напрямую. Таким образом, возвращаемое значение представляет собой новый объект Set. Четыре метода представляют математические операции с множествами: union() возвращает объект Set, полученный объединением множеств-аргументов, intersection() возвращает объект Set с общими элементами аргументов, difference() вычисляет разность множеств, a complement() — объект Set со всеми элементами, не входящими в пересечение. Чтобы создать простой пример использования этих методов, мы воспользуемся перечислением, содержащим разные названия акварельных красок:

//: generics/watercolors/Watercolors.java



package generics.watercolors;

 

public enum Watercolors {

ZINC, LEMON_YELLOW, MEDIUM_YELLOW, DEEP_YELLOW, ORANGE,

BRILLIANT_RED, CRIMSON, MAGENTA, ROSE_MADDER, VIOLET,

CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE,

COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE,

SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER,

BURNT_UMBER, PAYNES_GRAY, IVORY_BLACK

}

Для удобства (чтобы избежать уточнения всех имен) в следующем примере это перечисление импортируется статически. Мы используем EnumSet — новый инструмент Java SE5 для простого создания Set на базе перечисления. Статиче­скому методу EnumSet.range()передаются первый и последний элементы диапазона, по которому строится множество:

//: generics/WatercolorSets.java

import generics.watercolors.*;

import java.util.*;

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

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

import static generics.watercolors.Watercolors.*;

 

public class WatercolorSets {

public static void main(String[] args) {

Set<Watercolors> set1 =

EnumSet.range(BRILLIANT_RED, VIRIDIAN_HUE);

Set<Watercolors> set2 =

EnumSet.range(CERULEAN_BLUE_HUE, BURNT_UMBER);

print("set1: " + set1);

print("set2: " + set2);

print("union(set1, set2): " + union(set1, set2));

Set<Watercolors> subset = intersection(set1, set2);

print("intersection(set1, set2): " + subset);

print("difference(set1, subset): " +

difference(set1, subset));

print("difference(set2, subset): " +

difference(set2, subset));

print("complement(set1, set2): " +

complement(set1, set2));

}

}

<spoiler text="Output:"> (Sample)

set1: [BRILLIANT_RED, CRIMSON, MAGENTA, ROSE_MADDER, VIOLET, CERULEAN_BLUE_HUE, PHTHALO_BLUE,

ULTRAMARINE, COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE]

set2: [CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE, COBALT_BLUE_HUE, PERMANENT_GREEN,

VIRIDIAN_HUE, SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER, BURNT_UMBER]

union(set1, set2): [SAP_GREEN, ROSE_MADDER, YELLOW_OCHRE, PERMANENT_GREEN, BURNT_UMBER,

COBALT_BLUE_HUE, VIOLET, BRILLIANT_RED, RAW_UMBER, ULTRAMARINE, BURNT_SIENNA, CRIMSON,

CERULEAN_BLUE_HUE, PHTHALO_BLUE, MAGENTA, VIRIDIAN_HUE]

intersection(set1, set2): [ULTRAMARINE, PERMANENT_GREEN, COBALT_BLUE_HUE, PHTHALO_BLUE,

CERULEAN_BLUE_HUE, VIRIDIAN_HUE]

difference(set1, subset): [ROSE_MADDER, CRIMSON, VIOLET, MAGENTA, BRILLIANT_RED]

difference(set2, subset): [RAW_UMBER, SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, BURNT_UMBER]

complement(set1, set2): [SAP_GREEN, ROSE_MADDER, YELLOW_OCHRE, BURNT_UMBER, VIOLET,

BRILLIANT_RED, RAW_UMBER, BURNT_SIENNA, CRIMSON, MAGENTA]

</spoiler> В выходных данных показаны результаты выполнения каждой операции. В следующем примере представлены варианты вызова Sets.difference() для разных классов Collection и Map из java.util:

//: net/mindview/util/ContainerMethodDifferences.java

package net.mindview.util;

import java.lang.reflect.*;

import java.util.*;

 

public class ContainerMethodDifferences {

static Set<String> methodSet(Class<?> type) {

Set<String> result = new TreeSet<String>();

for(Method m : type.getMethods())

result.add(m.getName());

return result;

}

static void interfaces(Class<?> type) {

System.out.print("Interfaces in " +

type.getSimpleName() + ": ");

List<String> result = new ArrayList<String>();

for(Class<?> c : type.getInterfaces())

result.add(c.getSimpleName());

System.out.println(result);

}

static Set<String> object = methodSet(Object.class);

static { object.add("clone"); }



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


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


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

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

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


 


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

 
 

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

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