This repository has been archived on 2022-06-26. You can view files and clone it, but cannot push or open issues or pull requests.
dotnet-lab1/Lab1/SubjectIndex.cs

212 lines
7.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lab1
{
public class SubjectIndex : ISubjectIndex
{
Dictionary<string, List<int>> _data;
public SubjectIndex()
{
_data = new Dictionary<string, List<int>>();
}
public SubjectIndex(Dictionary<string, List<int>> data)
{
_data = data;
}
// Геттеры и сеттеры для поля _data
public Dictionary<string, List<int>> Data
{
get { return _data; }
set { _data = value; }
}
static SubjectIndex()
{
Console.WriteLine("Вызыван статический конструктор SubjectIndex");
}
// Загрузка из клавиатуры
public virtual void LoadFromKeyboard()
{
while (true)
{
Console.WriteLine("Введите слово:");
Console.WriteLine(".q - выйти");
Console.WriteLine("");
Console.Write("> ");
string input = Console.ReadLine();
// Если input == ".q", то выходим из цикла
if (input == ".q")
break;
if (input == "")
{
Console.WriteLine("Введена пустая строка!");
continue;
}
string key = input;
// Проверяем, что _data содержит слово
if (_data.ContainsKey(key))
{
Console.WriteLine("Предметный указатель содержит данное слово!");
continue;
}
_data[key] = new List<int>();
// Вводим номера страниц (максимум 10)
while (_data[key].Count < 10)
{
Console.WriteLine("Введите номер страницы ({0}/10):", _data[key].Count + 1);
Console.WriteLine(".q - выйти");
Console.WriteLine("");
Console.Write("> ");
input = Console.ReadLine();
// Если input == ".q" выходим из цикла (выход из ввода страниц)
if (input == ".q")
break;
int page;
// Проверка на корректность ввода
if (!int.TryParse(input, out page) || page <= 0)
{
Console.WriteLine("Некорректный ввод. Попробуйте еще раз.");
continue;
}
// Добавляем номер страницы в список
_data[key].Add(page);
}
}
}
// Загрузка из файла
public virtual void LoadFromFile(string filename)
{
// Открываем файл
System.IO.StreamReader file = new System.IO.StreamReader(filename);
int lineNumber = 0;
/*
* Читаем построчно из файла и добавляем в словарь
* Формат файла: слово и номера страниц, разделенные пробелом
*/
while (!file.EndOfStream)
{
lineNumber++;
string line = file.ReadLine();
string[] parts = line.Split(' ');
// Если массив parts пуст - выкидываем исключение
if (parts.Length == 0)
{
throw new Exception("Строка пустая!");
}
string key = parts[0];
// Если слово это пустая строка - выкидываем исключение
if (key == "")
{
throw new Exception("Слово пустое!");
}
// Если слово уже есть в словаре - выкидываем исключение
if (_data.ContainsKey(key))
{
throw new Exception("Предметный указатель содержит данное слово!");
}
List<int> value = new List<int>();
int page;
for (int i = 1; i < parts.Length; i++)
{
// Если parts[i] не является натуральным числом, то вызываем исключение
if (!int.TryParse(parts[i], out page) || page <= 0)
throw new Exception(String.Format("Некорректный формат файла! {0} - не является натуральным числом", parts[i]));
// Добавляем страницу в список
value.Add(page);
}
_data[key] = value;
}
}
// Вывод указателя
public virtual void Print()
{
string result = "";
foreach (KeyValuePair<string, List<int>> kvp in _data)
{
result += String.Format("\"{0}\": [", kvp.Key, kvp.Value);
result += (String.Join(", ", kvp.Value.ToArray())) + "]\n";
}
Console.WriteLine(result);
}
// Вывод номеров страниц для заданного слова
public virtual void PrintPages(string word)
{
Console.WriteLine(string.Join(", ", _data[word]));
}
// Удаление элемента из указателя
public virtual void Delete(string word)
{
_data.Remove(word);
}
// Индексатор
public List<int> this[string word]
{
get
{
return _data[word];
}
set
{
_data[word] = value;
}
}
// Перечислитель
public IEnumerator<KeyValuePair<string, List<int>>> GetEnumerator()
{
// Итератор
foreach (KeyValuePair<string, List<int>> kvp in _data)
{
yield return kvp;
}
}
// Переопределение метода ToString
public override string ToString()
{
string result = "SubjectIndex: \n";
foreach (KeyValuePair<string, List<int>> kvp in _data)
{
result += String.Format("\"{0}\": [", kvp.Key, kvp.Value);
result += (String.Join(", ", kvp.Value.ToArray())) + "]\n";
}
return result;
}
}
}