以下是存储在我的数组列表中的数据的格式。ArrayList搜索.net
A-Amsterdam
B- Brussels
C-Canada
如此等等。 我想通过只传递前几个字符来搜索我的数组列表,直到' - ' 因此,如果我有类似AA-Test的东西,那么我想通过'AA'来检查它是否存在。
我知道我可以使用contains或binarysearch,但它不能满足我的目的,因为它们都比较对象。
任何建议? 感谢
以下是存储在我的数组列表中的数据的格式。ArrayList搜索.net
A-Amsterdam
B- Brussels
C-Canada
如此等等。 我想通过只传递前几个字符来搜索我的数组列表,直到' - ' 因此,如果我有类似AA-Test的东西,那么我想通过'AA'来检查它是否存在。
我知道我可以使用contains或binarysearch,但它不能满足我的目的,因为它们都比较对象。
任何建议? 感谢
您可以通过创建自己的IComparer并将它传递到二分查找解决这个问题:
public class StartsWithComparer : IComparer
{
public int Compare(Object x, Object y)
{
String left = x as String;
String right = y as String;
if (ReferenceEquals(left, right))
{
return 0;
}
if (ReferenceEquals(left, null))
{
return -1;
}
if (ReferenceEquals(right, null))
{
return 1;
}
return (x.StartsWith(y) || y.StartsWith(x)) ? 0 : x.CompareTo(y);
}
}
后来......
myArrayList.Sort()
myArrayList.BinarySearch("AA", new StartsWithComparer());
你可能要考虑的大小arraylist以及您将要执行的查找次数:
如果您的数据集中有大量元素(大数组列表)或大数的搜索算法,您需要使用搜索算法,如二进制搜索
如果数据足够大,您可以考虑将数据存储在您希望通过前几个字符索引的散列表中( 'AA'在你的例子中)。
最后,对于小的数组列表大小和大量的查找,您可能会发现使用相同的比较器函数和线性搜索实际上表现更好。这已在此进一步讨论:At which n does binary search become faster than linear search on a modern CPU?