二变量排序算法
本文关键字:算法 排序 变量 | 更新日期: 2023-09-27 17:52:45
我正在寻找一种从西到东和从南到北排序位置点(经纬度)的算法。
排序时,点应从西、南开始排序。比较两点时,首先比较经度。数值越大(越向西)的点在列表中的位置越高。如果两点具有相同的经度(不太可能但可能),则比较两点的纬度。最低值(越靠南)在列表中位置越靠前
这个算法存在吗?也许在c#中?
ps-这些计算将仅限于美国大陆内的点。没有负纬度/经度值
using System.Linq;
var sortedPoints = points.OrderByDescending(p => p.Longitude).ThenBy(p => p.Latitude);
该算法在。net中并不存在(c#是一种语言,通常不实现算法,您通常会在。net基类库中找到它)。
但是,您可以轻松地创建具有Latitude
/Longitude
属性的Coordinates
结构/类(我认为每个属性都是double
),然后实现IComparable<T>
。
实现看起来像这样:
public class Coordinates : IComparable<Coordinates>
{
public double Latitude { get; set; }
public double Longitude { get; set; }
public int CompareTo(Coordinates other)
{
// If the other instance is null, assume that
// it is at 0,0? You need to make that determination.
if (other == null) return 1;
// Compare longitude (double implements
// IComparable<double>.
int comparison = Longitude.CompareTo(other.Longitude);
// If not 0, return the value.
if (comparison <> 0) return comparison;
// Compare latitude. Inverse the result, as the more
// south point (closer to 0) is greater.
// Just return the value, if they are different, the
// comparison value will be correct, if they are the
// same, then comparison will be 0.
return -Latitude.CompareTo(other.Latitude);
}
}
现在,您可以填充这些实例,将它们放在一个数组中,并将其传递给Array
类上的静态Sort
方法。Sort
方法将使用IComparable<T>
实现对数组进行排序。
或者您可以将它们放在List<T>
中(可能更容易,因为您可能事先不知道元素的数量),然后在实例上调用Sort
方法;它也将使用IComparable<T>
实现对自己进行排序。
你还提到两点是相同的。由于Latitude
和Longitude
被表示为double
,因此存在浮点错误的风险。如果你想减少这些错误,你可以很容易地将属性更改为decimal
(这保证了精度,直到某一点);这样,您将保证精度,并且它实现了IComparable<decimal>
,这意味着IComparable<Coordinates>
的实现将与开关一起工作。