zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    图像的剪切
    DOS指令大全(二)
    扫描进程
    数据库名、数据库实例、全局数据库名、服务名、SID等的区别
    ORA29807: specified operator does not exist
    TCP/IP网络编程的几个网站
    漂在等待离职的日子(三)
    入职第一天
    入职一周
    漂在等待离职的日子(八)
  • 原文地址:https://www.cnblogs.com/jyj666/p/13948888.html
Copyright © 2011-2022 走看看