212 lines
7.1 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|