Динамические структуры и классы в С# (на основе коллекций): множества hashset и sortedset.




 

Коллекция, содержащая только отличающиеся элементы, называется множеством (set). В составе.NET имеются два множества — HashSet<T> и SortedSet<T>. Оба они реализуют интерфейс ISet<T>. Класс HashSet<T> содержит неупорядоченный список различающихся элементов, а в SortedSet<T> элементы упорядочены.

 

Интерфейс ISet<T> предоставляет методы для создания объединения нескольких множеств, пересечения множеств и определения, является ли одно множество надмножеством или подмножеством другого.

 

Ниже перечислены наиболее употребительные конструкторы, определенные в классе HashSet<T>:

 

public HashSet ()

public HashSet(IEnumerable<T> collection)

public HashSet(IEqualityCompare comparer)

public HashSet(IEnumerable<T> collection, IEqualityCompare comparer)

В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.

 

В этом классе предоставляется также метод RemoveWhere(), удаляющий из множества элементы, удовлетворяющие заданному условию, или предикату. Помимо свойств, определенных в интерфейсах, которые реализуются в классе HashSet<T>, в него введено дополнительное свойство Comparer, приведенное ниже:

 

public IEqualityComparer<T> Comparer { get; }

Оно позволяет получать метод сравнения для вызывающего хеш-множества.

 

Ниже перечислены четыре наиболее часто используемых конструкторов, определенных в классе SortedSet<T>:

 

public SortedSet()

public SortedSet(IEnumerable<T> collection)

public SortedSet(IComparer comparer)

public SortedSet(IEnumerable<T> collection, IComparer comparer)

В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.

 

В этом классе предоставляется также метод GetViewBetween(), возвращающий часть множества в форме объекта типа SortedSet<T>, метод RemoveWhere(), удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату, а также метод Reverse(), возвращающий объект типа IEnumerable<T>, который циклически проходит множество в обратном порядке.

 

Помимо свойств, определенных в интерфейсах, которые реализуются в классе SortedSet<T>, в него введены дополнительные свойства, приведенные ниже:

 

public IComparer<T> Comparer { get; }

public T Max { get; }

public T Min { get; }

Свойство Comparer получает способ сравнения для вызывающего множества. Свойство Мах получает наибольшее значение во множестве, а свойство Min — наименьшее значение во множестве. Давайте рассмотрим пример использования множеств:

 

using System;

using System.Collections.Generic;

 

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

// Создадим два множества

SortedSet<char> ss = new SortedSet<char>();

SortedSet<char> ss1 = new SortedSet<char>();

 

ss.Add('A');

ss.Add('B');

ss.Add('C');

ss.Add('Z');

ShowColl(ss, "Первая коллекция: ");

 

ss1.Add('X');

ss1.Add('Y');

ss1.Add('Z');

ShowColl(ss1, "Вторая коллекция");

 

ss.SymmetricExceptWith(ss1);

ShowColl(ss,"Исключили разноименность (одинаковые элементы) двух множеств: ");

ss.UnionWith(ss1);

ShowColl(ss, "Объединение множеств: ");

ss.ExceptWith(ss1);

ShowColl(ss, "Вычитание множеств");

Console.ReadLine();

}

 

static void ShowColl(SortedSet<char> ss, string s)

{

Console.WriteLine(s);

foreach (char ch in ss)

Console.Write(ch + " ");

Console.WriteLine("\n");

}

}

}

 

Отладить выполнение тестовых примеров.

Далее выполнить задание по варианту.

Задания:

1. Задать множество А случайным образом из k элементов, каждый из элементов взять из диапазона [0, m ] (повторяющиеся элементы удалить). Задать случайным образом элемент из диапазона [0, m + n ], проверить, входит ли этот элемент во множество А. Найти кардинальное число множества А, найти кардинальное число булеана множества А.


 

Варианты заданий:

№ варианта 1/14 2/15 3/16 4/17 5/18 6/19 7/20 8/21 9/22 10/23 11/24 12/25 13/26
k                          
m                          
n                          

 

2. Составить множество А из букв фамилии, множество В – из букв имени, множество С – из букв отчества (повторяющиеся элементы удалить). Найти: объединение множеств А, В и С, пересечение множеств А, В и С, разность А \ В, разность В \ А.

 

Откомпилировать проект

Предъявить проект для проверки с тестовым примером

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2023-01-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: