leetcode973. 最接近原点的 K 个点(谈谈C#中的Icomparer,ComParer,IComparable)

今天刷leetcode遇到一道题,让我感觉我对Icomparer的理解非常不足,题目如下:

我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。

(这里,平面上两点之间的距离是欧几里德距离。)

你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。

 

示例 1:

输入:points = [[1,3],[-2,2]], K = 1
输出:[[-2,2]]
解释:
(1, 3) 和原点之间的距离为 sqrt(10),
(-2, 2) 和原点之间的距离为 sqrt(8),
由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。
我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
示例 2:

输入:points = [[3,3],[5,-1],[-2,4]], K = 2
输出:[[3,3],[-2,4]]
(答案 [[-2,4],[3,3]] 也会被接受。)

根据官方解法,我写出了C#版本的答案:如下

public class Solution 
{
        public int[][] KClosest(int[][] points, int K)
        {
            //int[] res=new int[points[0].Length];
            //Dictionary<int,int[][]> dict=new Dictionary<int,int[][]>();

            Array.Sort(points, new newCom());
            int[][] res = new int[K][];
            Array.Copy(points, res, K);
            return res;
        }
        
}
    
    public class newCom : IComparer<int[]>
    {
         int IComparer<int[]>.Compare(int[] point1, int[] point2)
        {
            return (point1[0] * point1[0] + point1[1] * point1[1]) - (point2[0] * point2[0] + point2[1] * point2[1]);
        }
    }

这道题并不难,但是考察了Sort方法和Icomparer的用法,这里我查了下资料一共有Icomparer,ComParer,IComparable三个东东。

总结:

IComparable<>要在要比较的对象类中实现接口CompareTo;
IComparer<>要在一个单独的类中实现,可以比较任意两个对象;

因此如果你使用的这个类的某些东西被封装后,可以使用IComparer来实现,但是如果没有被封装,可以使当前类实现IComparable的CompareTo方法来达到比较的目的。

对于Comparer类借鉴了这位大佬的看法:

原文地址:https://blog.csdn.net/lidandan2016/article/details/78480237

.net framework 在类 Comparer 上提供了IComparer 接口的默认实现方式,类 Comparer 位于system.collections 名称空间中,可以对简单类型以及支持IComparable
接口的任意类型进行特定文化的比较。例如,可以通过下面的代码使用它:

代码如下:

string firststring = "First String";
string secondstring = "Second string";
Comparer.Default.Compare(firststring , secondstring);

int firstNumber = 35;
int secondNumber = 23;
Comparer.Default.Compare(firstNumber , secondNumber);

 

这里使用Comparer.Default静态成员获取Comparer类的一个实例,接着使用 Compare()方法来比较。
在使用 Comparer时,必须使用可以比较的类型。例如,试图比较firstString 和 firstNumber 就会生成一个异常。
下面是这个类的一些注意事项:

.net框架包含两个类,实现了IComparer接口,Comparer和CaseInsensitiveComparer类提供了IComparer的基本实现方式。
1)不要使用new运算符直接创建Comparer类的实例,应调用Default方法,该方法将返回一个已被适当地初始化过的Comparer对象,如下:
ComparertheComparer=Comparer.Default;
拥有Comparer对象以后,可以将比较类委托给调用它的Compare方法,如下:
publicint Compare(object x,object y)
{
  returnComparer.Default.Compare(x,y);
}
2)CaseInsensitiveComparer类的行为与Comparer类非常相似,都是通过ICompareble接口比较任意两个对象,区别是前者对遇到的字符串不区分大小写的比较。与Comparer类似,初始化过的CaseInsensitiveComparer对象可以使用静态Default方法来获取索引,如下:
CaseInsensitiveCompareraComparer=CaseInsensitiveComparer.Default;

posted @ 2020-11-09 15:42  苏州の酱醋茶  阅读(159)  评论(0编辑  收藏  举报