【发布时间】:2014-09-10 15:07:53
【问题描述】:
即使列表已排序,二分查找也会返回错误值。这是列表:
1707 ABCD
1707 XXXX
1725 DEFG
1725 HIJK
1725 LMNOP
我从按时间(第一列)预排序的文件中获取此列表,因此我不在我的代码中对其进行排序。当我对 1725 DEFG 进行二进制搜索时,它会在按位补码之前返回 1725 LMNOP。如果我进行按位补码,结果将是 1725 HIJK。
为什么会这样?
下面是实现:
public class RecComparer: IComparer<MyData>
{
public int Compare(MyData x, MyData y)
{
if (x.DateDetails == null)
{
if (y.DateDetails == null)
{
return 0;
}
else
{
return -1;
}
}
else
{
if (y.DateDetails == null)
{
return 1;
}
else
{
int retval = x.DateDetails.Length.CompareTo(y.DateDetails.Length);
if (retval != 0)
{
return retval;
}
else
{
return x.DateDetails.CompareTo(y.DateDetails);
}
}
}
}
}
这是对 BinarySearch 的调用:
lookAhead = recordList.BinarySearch(lookAheadtime, (IComparer<MyData>)rc);
任何原因都是它的行为方式。
编辑:
public class MyData
{
public string DateDetails { get; set; }
public string TrackDetails { get; set; }
}
【问题讨论】:
-
我不相信二进制搜索适用于非唯一键
-
那么最好的实现方式是什么。
-
@DarrenKopp:如果是这种情况,我是否应该也包括列表的第二列,而不是仅按第一列搜索。
-
您必须重现列表的排序方式。所以比较字符串长度是完全不合适的。您必须首先从字符串中挖掘出时间,就像原始代码一样,首先进行比较。然后仅在时间相同时才比较其余部分。 not 使用字符串但首先将源代码解析到您自己的类中,您会领先一步。
-
你为什么要先用长度来比较?
标签: c# list binary-search