请注意,我知道ArrayList已经老了......但是我需要知道并了解它是如何工作的,所以请耐心等待(顺便说一句,不确定我是否拼写了熊,我忘了怎么拼写它。 ..xD)
我明天正在写一个考试(即将进入大学),但我对这个问题走到了尽头,我喜欢整理出问题,但我无法找到解决这个问题的方法......
说我有:
class Person
{
private string name, surname;
private int age, year born;
//with more variables, etc...
我有另一个班级
Class People
{
ArrayList arlPeople = new ArrayList();
}
我知道代码不是任何有效的工作顺序,但只是为了让我的问题更清晰
好的,所以我想知道,用户输入了一个名字
Console.Writeline("display all dat of the person by entering their name >>")
所以用户输入名称,但是......
由于arraylist提供.sort()
和.binarysearch()
,我想找到使用二进制搜索方法输入姓名的人的位置
二进制搜索需要参数(Object value)
,但如何将用户输入的名称作为对象参数传递???
请帮助!!!
答案 0 :(得分:2)
您的Person
对象可以实现IComparable
。也就是说,您需要添加一个比较名称的compareTo
方法:
class Person : IComparable
{
private string name, surname;
private int age, year born;
public int CompareTo(object obj) {
return name.compareTo((obj as Person).name);
}
...
}
我不推荐它,但我遵循了避免泛型的例子。如果您这样做,您应该覆盖Equals
和GetHashCode
。
蒂姆S.有一个很好的答案,使用IComparer
代替。考虑一下,根据您是否认为Person
具有内在可比性或仅能够进行比较,它可能更有意义。
答案 1 :(得分:2)
这有效:
class NameComparer : IComparer
{
public int Compare(Object x, Object y)
{
var xs = (Swimmer)x;
var ys = (Swimmer)y;
return xs.Name.CompareTo(ys.Name);
}
}
class Swimmer
{
public string Name { get; set; }
}
class Swimmers
{
ArrayList AllSwimmers;
IComparer nameComparer = new NameComparer();
public Swimmers()
{
AllSwimmers = new ArrayList();
AllSwimmers.Add(new Swimmer { Name = "Tom" });
AllSwimmers.Add(new Swimmer { Name = "Joe" });
AllSwimmers.Add(new Swimmer { Name = "George" });
AllSwimmers.Sort(nameComparer);
}
//some other methods in between
public int GetOnName()
{
Console.WriteLine("Enter the name of the swimmer");
string name = Console.ReadLine();
int pos = AllSwimmers.BinarySearch(new Swimmer { Name = name }, nameComparer);
Console.WriteLine(pos);
return pos;
}
}