русс | укр

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

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

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

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


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

Множество


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


В множествах (Set) каждое значение может храниться только в одном экземпляре. Попытки добавить новый экземпляр эквивалентного объекта блокируются. Множества часто используются для проверки принадлежности, чтобы вы могли легко проверить, принадлежит ли объект заданному множеству. Следовательно, важнейшей операцией Set является операция поиска, поэтому на практике обычно выбирается реализация HashSet, оптимизированная для быстрого поиска.

Set имеет такой же интерфейс, что и Collection. В сущности, Set и является Collection, но обладает несколько иным поведением (кстати, идеальный пример использования наследования и полиморфизма: выражение разных концепций поведения). Пример использованияHashSet с объектами Integer:

//: holding/SetOfInteger.java

import java.util.*;

 

public class SetOfInteger {

public static void main(String[] args) {

Random rand = new Random(47);

Set<Integer> intset = new HashSet<Integer>();

for(int i = 0; i < 10000; i++)

intset.add(rand.nextInt(30));

System.out.println(intset);

}

}

<spoiler text="Output:">

[15, 8, 23, 16, 7, 22, 9, 21, 6, 1, 29, 14, 24, 4, 19, 26, 11, 18, 3, 12, 27, 17, 2, 13,

28, 20, 25, 10, 5, 0]

</spoiler> В множество включаются десять тысяч случайных чисел от 0 до 29; естественно, числа должны многократно повторяться. Но при этом мы видим, что в результатах каждое число присутствует только в одном экземпляре.

Также обратите внимание на непредсказуемый порядок следования чисел в выводе. Это объясняется тем, что HashSet использует хеширование для ускорения выборки. Порядок, поддерживаемый HashSet, отличается от порядка TreeSet или LinkedHashSet, поскольку каждая реализация упорядочивает элементы по-своему. Если вы хотите, чтобы результат был отсортирован, воспользуйтесь TreeSet вместо HashSet:



//: holding/SortedSetOfInteger.java

import java.util.*;

 

public class SortedSetOfInteger {

public static void main(String[] args) {

Random rand = new Random(47);

SortedSet<Integer> intset = new TreeSet<Integer>();

for(int i = 0; i < 10000; i++)

intset.add(rand.nextInt(30));

System.out.println(intset);

}

}

<spoiler text="Output:">

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,

23, 24, 25, 26, 27, 28, 29]

</spoiler> Одной из наиболее распространенных операций со множествами является проверка принадлежности методом contains(), но существуют и другие операции, которые напомнят вам диаграммы Венна из школьного курса:

//: holding/SetOperations.java

import java.util.*;

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

 

public class SetOperations {

public static void main(String[] args) {

Set<String> set1 = new HashSet<String>();

Collections.addAll(set1,

"A B C D E F G H I J K L".split(" "));

set1.add("M");

print("H: " + set1.contains("H"));

print("N: " + set1.contains("N"));

Set<String> set2 = new HashSet<String>();

Collections.addAll(set2, "H I J K L".split(" "));

print("set2 in set1: " + set1.containsAll(set2));

set1.remove("H");

print("set1: " + set1);

print("set2 in set1: " + set1.containsAll(set2));

set1.removeAll(set2);

print("set2 removed from set1: " + set1);

Collections.addAll(set1, "X Y Z".split(" "));

print("'X Y Z' added to set1: " + set1);

}

}

<spoiler text="Output:">

H: true

N: false

set2 in set1: true

set1: [D, K, C, B, L, G, I, M, A, F, J, E]

set2 in set1: false

set2 removed from set1: [D, C, B, G, M, A, F, E]

'X Y Z' added to set1: [Z, D, C, B, G, M, A, F, Y, X, E]

</spoiler> Имена методов говорят за себя. Информацию о других методах Set можно найти в документации JDK.

 

Карта

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

//: holding/Statistics.java

// Простой пример использования HashMap

import java.util.*;

 

public class Statistics {

public static void main(String[] args) {

Random rand = new Random(47);

Map<Integer,Integer> m =

new HashMap<Integer,Integer>();

for(int i = 0; i < 10000; i++) {

// Получение случайного числа от 0 до 20.

int r = rand.nextInt(20);

Integer freq = m.get(r);

m.put(r, freq == null ? 1 : freq + 1);

}

System.out.println(m);

}

}

<spoiler text="Output:">

{15=497. 4=481. 19=464. 8=468. 11=531. 16=533. 18=478. 3=508, 7=471. 12=521. 17=509. 2=489,

13=506, 9=549, 6=519, 1=502, 14=477, 10=513, 5=503, 0=481}

</spoiler> В main() механизм автоматической упаковки преобразует случайно сгенерированое целое число в ссылку на Integer, которая может использоваться с HashMap (контейнеры не могут использоваться для хранения примитивов).

Метод get() возвращает null, если элемент отсутствует в контейнере (то есть если число было сгенерировано впервые. В противном случае метод get() возвращает значение Integer, связанное с ключом, и последнее увеличивается на 1 (автоматическая упаковка снова упрощает вычисления, но в действительности при этом выполняются преобразования к Integer и обратно).

Следующий пример демонстрирует поиск объектов Pet по строковому описанию String. Он также показывает, как проверить присутствие некоторого ключа или значения в Map методами containsKey() и containsValue():

//: holding/PetMap.java

import typeinfo.pets.*;

import java.util.*;

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

 

public class PetMap {

public static void main(String[] args) {

Map<String,Pet> petMap = new HashMap<String,Pet>();

petMap.put("My Cat", new Cat("Molly"));

petMap.put("My Dog", new Dog("Ginger"));

petMap.put("My Hamster", new Hamster("Bosco"));

print(petMap);

Pet dog = petMap.get("My Dog");

print(dog);

print(petMap.containsKey("My Dog"));

print(petMap.containsValue(dog));

}

}

<spoiler text="Output:">

{My Cat=Cat Molly, My Hamster=Hamster Bosco, My Dog=Dog Ginger}

Dog Ginger

true

true

</spoiler> Map, по аналогии с массивами и Collection, легко расширяются до нескольких измерений; достаточно создать Map со значениями типа Map (причем значениями этих Map могут быть другие контейнеры, и даже другие Map). Контейнеры легко комбинируются друг с другом, что позволяет быстро создавать сложные структуры данных. Например, если нам потребуется сохранить информацию о владельцах сразу нескольких домашних животных, для этого будет достаточно создать контейнер Map<Person,List<Pet>>:

//: holding/MapOfList.java

package holding;

import typeinfo.pets.*;

import java.util.*;

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

 

public class MapOfList {

public static Map<Person, List<? extends Pet>>

petPeople = new HashMap<Person, List<? extends Pet>>();

static {

petPeople.put(new Person("Dawn"),

Arrays.asList(new Cymric("Molly"),new Mutt("Spot")));

petPeople.put(new Person("Kate"),

Arrays.asList(new Cat("Shackleton"),

new Cat("Elsie May"), new Dog("Margrett")));

petPeople.put(new Person("Marilyn"),

Arrays.asList(

new Pug("Louie aka Louis Snorkelstein Dupree"),

new Cat("Stanford aka Stinky el Negro"),

new Cat("Pinkola")));

petPeople.put(new Person("Luke"),

Arrays.asList(new Rat("Fuzzy"), new Rat("Fizzy")));

petPeople.put(new Person("Isaac"),

Arrays.asList(new Rat("Freckly")));

}

public static void main(String[] args) {

print("People: " + petPeople.keySet());

print("Pets: " + petPeople.values());

for(Person person : petPeople.keySet()) {

print(person + " has:");

for(Pet pet : petPeople.get(person))

print(" " + pet);

}

}

}

<spoiler text="Output:">

People: [Person Luke, Person Marilyn, Person Isaac, Person Dawn, Person Kate]

Pets: [[Rat Fuzzy, Rat Fizzy], [Pug Louie aka Louis Snorkelstein Dupree, Cat Stanford aka Stinky

el Negro, Cat Pinkola], [Rat Freckly], [Cymric Molly, Mutt Spot], [Cat Shackleton, Cat Elsie May,

Dog Margrett]]

Person Luke has:

Rat Fuzzy

Rat Fizzy

Person Marilyn has:

Pug Louie aka Louis Snorkelstein Dupree

Cat Stanford aka Stinky el Negro

Cat Pinkola

Person Isaac has:

Rat Freckly

Person Dawn has:

Cymric Molly

Mutt Spot

Person Kate has:

Cat Shackleton

Cat Elsie May

Dog Margrett

</spoiler> Map может вернуть множество (Set) своих ключей, коллекцию (Collection) значений или множество (Set) всех пар «ключ-значение». Метод keySet() создает множество всех ключей, которое затем используется в синтаксисе foreach для перебора Map.



<== предыдущая лекция | следующая лекция ==>
LinkedList | Очередь


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


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

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

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


 


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

 
 

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

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