我的书C# 3.0 Cookbook by O'Reilly有以下示例让我感到困惑。 (下面的确切转录。)
// Count the number of times an item appears in the sort List<T>.
public static int BinarySearchCountAll<T>(this List<T> myList, T searchValue)
{
// Search for the first item.
int center = myList.BinarySearch(searchValue);
int left = center;
while (left < 0 && myList[left-1].Equals(searchValue))
{
left -= 1;
}
int right = center;
while (right < (myList.Count - 1) && myList[right+1].Equals(searchValue))
{
right += 1;
}
return (right - left) + 1;
}
特别是,我从
开始感到困惑int center = myList.BinarySearch(searchValue);
int left = center;
while (left < 0 && myList[left-1].Equals(searchValue))
片段。根据{{3}}方法,left
是元素的索引。那么条件如何
left < 0 && myList[left-1].Equals(searchValue)
while
循环中的有意义吗?由于短路,如果left < 0
,则评估右侧myList[left-1].Equals(searchValue)
,但myList[left-1]
正在访问负索引!正确?
如果找不到元素,我确实阅读了关于BinarySearch中发生的事情的部分
负数,是指数的按位补码 大于项目的下一个元素,如果没有更大的元素 element,Count的按位补码。
我无法弄清楚我的书中的这种方法是否试图利用这一事实。看起来像一个非常混乱的写作方式应该是一个简单的方法,否则我没有正确理解它。因为如果我正确理解BinarySearch
返回找到的任意第一个匹配元素,那么我就不能理解为什么该方法不能
// Count the number of times an item appears in the sort List<T>.
public static int BinarySearchCountAll<T>(this List<T> myList, T searchValue)
{
int count = 0,
int center = myList.BinarySearch(searchValue);
if ( center < 0 ) return count;
for ( int k = center + 1; k < myList.Length - 1 && myList[k] = searchValue; ++k )
++count;
for ( int k = center - 1; k >=0 && myList[k] = searchValue; --k )
++count;
return count;
}
答案 0 :(得分:0)
你是对的
final Dialog dialog = new Dialog(EditTextActivity.this);
dialog.setContentView(R.layout.registration_picker_dialog);
dialog.setTitle("Edit Year");
应该是
while (left < 0 && myList[left-1].Equals(searchValue))
代替。 注意右边的对称性:while(右边&lt;(myList.Count - 1)....自然暗示它应该比左边更大。
BinarySearchCountAll方法找到索引“center”,其中center = searchValue。由于列表已排序,因此它可以简单地遍历相邻元素,直到它们不等于“中心”。然后,它返回相等“中心”元素的数量