Реализовать бинарный поиск для переопределенного компаратора - C#
Формулировка задачи:
Добрый день, такая проблема: Не могу понять как мне реализовать бинарный поиск для моего переопределенного компаратора. Суть задачи: написать линейный поиск и проверить встроенным бинарным. Вот с бинарным то и проблемы. Коллекция ArrayList.
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class Student : IComparable
{
/* Переопределяем стандартный метод CompareTo интерфейса IComparable,
нужный для вызова метода Sort */
public int CompareTo(Object rhs)
{
Student r = (Student)rhs;
Int32 ret = this.Name.CompareTo(r.Name);
if (ret == 0)
{
ret = this.Surname.CompareTo(r.Name);
}
if (ret == 0)
{
ret = this.FatherName.CompareTo(r.FatherName);
}
if (ret == 0)
{
ret = this.gruppa.CompareTo(r.gruppa);
}
return ret;
}
//обьявление членов класса
public string Name;
public string Surname;
public string FatherName;
public int Age;
public string Pol;
public double Rez1;
public double Rez2;
public double Rez3;
public int gruppa;
}
public class Sort
{
static StreamReader read; //поток для чтения
static int NumberLines()
{
int kol = 0;
String line;
while ((line = read.ReadLine()) != null)
{
kol++;
}
read.Close();
return kol;
}
static void ReadFile(Student[] a)
{
char[] delimiters = { ' ' };
string strfromfile = read.ReadLine();
string[] line = new string[9];
int i = 0;
while (strfromfile != null)
{
a[i] = new Student();
line = strfromfile.Split(delimiters);
a[i].Name = line[0];
a[i].Surname = line[1];
a[i].FatherName = line[2];
a[i].Age = Convert.ToInt32(line[3]);
a[i].Pol = line[4];
a[i].Rez1 = Convert.ToDouble(line[5]);
a[i].Rez2 = Convert.ToDouble(line[6]);
a[i].Rez3 = Convert.ToDouble(line[7]);
a[i].gruppa = Convert.ToInt32(line[8]);
i++;
strfromfile = read.ReadLine();
}
read.Close();
}
static void Output(Student[] a)
{
foreach (Student i in a)
{
Console.Write("{0} {1} {2} {3} {4} {5} {6} {7} {8}\n", i.Name, i.Surname, i.FatherName, i.Age, i.Pol, i.Rez1, i.Rez2, i.Rez3, i.gruppa);
}
}
static void AddtoArrayList(Student[] a, int n)
{
ArrayList win = new ArrayList();
for (int i = 0; i < n; i++)
{
win.Add(a[i]);
}
Console.WriteLine("Сортировка ArrayList.Sort()\n");
win.Sort();
//вывод элементов отсортированного массива - доступ к нему как к коллекции
foreach (Student i in win)
{
Console.Write("{0} {1} {2} {3} {4} {5} {6} {7} {8}\n", i.Name, i.Surname, i.FatherName, i.Age, i.Pol, i.Rez1, i.Rez2, i.Rez3, i.gruppa);
}
//Сортировка Шелла
}
static void Shell(Student[] a, int n)
{
int step = n / 2;
while (step > 0)//пока шаг не 0
{
for (int i = 0; i < (n - step); i++)
{
int j = i;
//будем идти начиная с i-го элемента
while (j >= 0 && a[j].CompareTo(a[j + step]) == 1)
//пока не пришли к началу массива
//и пока рассматриваемый элемент больше
//чем элемент находящийся на расстоянии шага
{
//меняем их местами
Student temp = a[j];
a[j] = a[j + step];
a[j + step] = temp;
j--;
}
}
step = step / 2;//уменьшаем шаг
}
Console.Write("\nСортировка Шелла\n\n");
Output(a);
}
static void LinearSearch(Student[] a, int n)
{
Console.WriteLine("\nЛинейный поиск:\nЧто найти?");
string p = Console.ReadLine();
for (int i = 0; i < n; i++)
{
string fullName = a[i].Name + " " + a[i].Surname + " " + a[i].FatherName;
if (p == fullName)
{
Console.Write(i);
}
}
}
/* static void BinarySrch(Student[] a, int n)
{
ArrayList win = new ArrayList();
for (int i = 0; i < n; i++)
{
win.Add(a[i]);
}
win.Sort();
Console.WriteLine("Двоичный поиск:\nчто ищем?");
string str = Console.ReadLine();
Console.WriteLine(win.BinarySearch(str));
}*/
static void Main(string[] args)
{
read = new StreamReader("D:\\i.txt");
int kol = NumberLines();
Student[] a = new Student[kol];
read = new StreamReader("D:\\i.txt");
ReadFile(a);
AddtoArrayList(a, kol);
Shell(a, kol);
LinearSearch(a, kol);
// BinarySrch(a,kol);
Console.ReadKey();
}
}
}Решение задачи: «Реализовать бинарный поиск для переопределенного компаратора»
textual
Листинг программы
public class Student : IComparable
{
/* Переопределяем стандартный метод CompareTo интерфейса IComparable,
нужный для вызова метода Sort */
public int CompareTo (Object ro)
{
Student r = ro as Student;
if (r == null)
return 1;
int ret = Name.CompareTo (r.Name);
if (ret != 0)
return ret;
ret = Surname.CompareTo (r.Surname);
if (ret != 0)
return ret;
ret = FatherName.CompareTo (r.FatherName);
if (ret != 0)
return ret;
return gruppa.CompareTo (r.gruppa);
}
//обьявление членов класса
public string Name;
public string Surname;
public string FatherName;
public int Age;
public string Pol;
public double Rez1;
public double Rez2;
public double Rez3;
public int gruppa;
public override string ToString ()
{
return string.Format ("[Student: Name={0}, Surname={1}, FatherName={2}, gruppa={3}]", Name, Surname, FatherName, gruppa);
}
}
static void Main (string[] args)
{
ArrayList l = new ArrayList ();
l.Add (new Student () {Name = "Иван", FatherName = "Петрович", Surname = "Козлов", gruppa = 1});
l.Add (new Student () {Name = "Иван", FatherName = "Иванович", Surname = "Агафонов", gruppa = 1});
l.Sort ();
Console.WriteLine (String.Join ("\n", l.ToArray()));
}