- •Лабораторная 8. Динамические структуры. Коллекции списки в c# и Java
- •Добавление элемента;
- •Динамические структуры данных
- •Списки, их виды Односвязный список
- •Двусвязный список
- •Классы c# для описания указанных типов данных Класс List и его методы
- •Класс LinkedList и его методы
- •Класс LinkedListNode представляет узел в LinkedList. Его свойства:
- •Классы-коллекции в Java
- •Классы-коллекции
- •Абстрактные классы
- •Понятие интерфейса в Java. Описание интерфейса
- •Реализация интерфейса
- •Интерфейсы-коллекции
- •Интерфейс Collection
- •Интерфейс List
- •Классы коллекций
- •Класс LinkedList
- •Лямбда - выражения в Java
- •В лямбда – выражение передаются не только данные, но и поведение
Класс LinkedList и его методы
Коллекция представляет двунаправленный список.
Объявление списка имеет вид:
LinkedList<тип входящего объекта> имя =
new LinkedList< тип входящего объекта>();
У класса имеются свойства
Count - Число элементов, которое фактически содержится в коллекции.
First - Первый узел списка
Last - Последний узел списка
Полезные методы класса LinkedList перечислены в табл.
Некоторые методы класса LinkedList Таблица
Метод |
Описание |
AddAfter(существующий узел коллекции, объект) |
Добавляет объект после существующего узла коллекции |
AddAfter(существующий узел коллекции, новый узел) |
Добавляет указанный новый узел после указанного существующего узла в коллекцию |
AddBefore(существующий узел коллекции, объект) |
Добавляет объект перед существующим узлом коллекции |
AddBefore(существующий узел коллекции, новый узел) |
Добавляет указанный новый перед существующим узлом коллекции |
AddFirst(объект) |
Добавляет объект в начало коллекции |
AddLast(объект) |
Добавляет объект в конец коллекции |
Clear() |
Удаляет все элементы из коллекции |
bool Contains(элемент)
|
Определяет, входит ли элемент в состав коллекции |
bool Exists(метод)
|
Определяет, содержит ли коллекция элементы, удовлетворяющие условиям указанного метода, который в качестве параметра должен иметь объект того класса, который помещен в коллекцию |
Узел с найденным значением Find(объект - значение)
|
Выполняет поиск объекта, совпадающего с искомым значением, начиная с начала коллекции, и возвращает узел с найденным значением или null |
Узел с найденным значением FindLast(объект - значение)
|
Выполняет поиск объекта, совпадающего с искомым значением, начиная с конца коллекции, и возвращает узел с найденным значением или null |
bool Remove(узел)
|
Удаляет первое вхождение указанного узла из коллекции |
bool RemoveFirst()
|
Удаляет первый элемент из коллекции |
bool RemoveLast()
|
Удаляет последний элемент из коллекции |
Класс LinkedListNode представляет узел в LinkedList. Его свойства:
Next – следующий узел в списке
Previous – предыдущий узел в списке
Value – возвращает значение узла
В следующем примере кода показаны различные методы класса LinkedList.
using System;
using System.Text;
using System.Collections.Generic;
public class Example
{ public static void Main()
{ // Создание списка
string[] words =
{ "the", "fox", "jumped", "over", "the", "dog" };
LinkedList<string> sentence = new LinkedList<string>(words);
Display(sentence, "Элементы списка:");
Console.WriteLine("sentence.Contains(\"jumped\") = {0}",
sentence.Contains("jumped"));
// Добавление слова 'today' в начало списка
sentence.AddFirst("today");
Display(sentence, "Тест 1: Добавлено 'today' в начало списка:");
// Перемещение первого узла в конец списка
LinkedListNode<string> mark1 = sentence.First;
sentence.RemoveFirst();
sentence.AddLast(mark1);
Display(sentence, "Тест 2: Первый узел перемещен в конец списка:");
// Изменение последнего узла на 'yesterday'.
sentence.RemoveLast();
sentence.AddLast("yesterday");
Display(sentence, "Тест 3: Последний узел изменен на 'yesterday':");
// Перемещение последнего узла в начало
mark1 = sentence.Last;
sentence.RemoveLast();
sentence.AddFirst(mark1);
Display(sentence, "Тест 4: Последний узел перемещен в начало:");
// Указать последнее вхождение элемента 'the'.
sentence.RemoveFirst();
LinkedListNode<string> current = sentence.FindLast("the");
IndicateNode(current, "Тест 5: Указать последнее вхождение слова 'the':");
// Добавить 'lazy' и 'old' после 'the' (Узел LinkedListNode назван current).
sentence.AddAfter(current, "old");
sentence.AddAfter(current, "lazy");
IndicateNode(current, "Test 6: Add 'lazy' and 'old' after 'the':");
// Найти узел 'fox'.
current = sentence.Find("fox");
IndicateNode(current, "Тест 7: Найти узел 'fox':");
// Добавить 'quick' и 'brown' перед 'fox':
sentence.AddBefore(current, "quick");
sentence.AddBefore(current, "brown");
IndicateNode(current, "Тест 8: Добавлены 'quick'и 'brown' перед 'fox':");
// Сохранить ссылку на текущий узел 'fox',
// и на предыдущий узел в списке. Найти узел 'dog'.
mark1 = current;
LinkedListNode<string> mark2 = current.Previous;
current = sentence.Find("dog");
IndicateNode(current, "Test 9: Indicate the 'dog' node:");
// Метод AddBefore вызывает исключениеnvalidOperationException
// при попытке добавить узел, уже принадлежащий списку.
Console.WriteLine("Тест 10: Появление исключения при добавлении узла (fox), уже существующего в списке already in the list:");
try
{
sentence.AddBefore(current, mark1);
}
catch (InvalidOperationException ex)
{
Console.WriteLine("Сообщение исключения: {0}", ex.Message);
}
Console.WriteLine();
// Удаление узла, на который ссылается mark1, и затем добавление его
// перед узлом, на который ссылается current.
// Поиск узла, на который ссылается current.
sentence.Remove(mark1);
sentence.AddBefore(current, mark1);
IndicateNode(current, "Тест 11: Узел, на который ссылается mark1 (fox) //перед текущим узлом (dog):");
// Удаление узла, на который ссылается current.
sentence.Remove(current);
IndicateNode(current, "Тест 12: Удален узел (dog) и попытка найти его:");
// Add the node after the node referred to by mark2.
sentence.AddAfter(mark2, current);
IndicateNode(current, "Test 13: Add node removed in test 11 after a referenced node (brown):");
// The Remove method finds and removes the
// first node that that has the specified value.
sentence.Remove("old");
Display(sentence, "Test 14: Remove node that has the value 'old':");
// Удаление всех узлов.
sentence.Clear();
Console.WriteLine();
Console.WriteLine("Тест 15: Список пуст. Проверка, принадлежит ли списку 'jumped' = {0}",
sentence.Contains("jumped"));
Console.ReadLine();
}
private static void Display(LinkedList<string> words, string test)
{
Console.WriteLine(test);
foreach (string word in words)
{
Console.Write(word + " ");
}
Console.WriteLine();
Console.WriteLine();
}
private static void IndicateNode(LinkedListNode<string> node, string test)
{
Console.WriteLine(test);
if (node.List == null)
{
Console.WriteLine("Узел '{0}' не принадлежит списку\n",
node.Value);
return; }
StringBuilder result = new StringBuilder("(" + node.Value + ")");
LinkedListNode<string> nodeP = node.Previous;
while (nodeP != null)
{
result.Insert(0, nodeP.Value + " ");
nodeP = nodeP.Previous;
}
node = node.Next;
while (node != null)
{
result.Append(" " + node.Value);
node = node.Next;
}
Console.WriteLine(result);
Console.WriteLine();
}
}
