Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的IEquatable有什么问题<;T>;,i可比较<;T>;实施SortedList抛出异常_C#_.net_Icomparable_Iequatable - Fatal编程技术网

C# 我的IEquatable有什么问题<;T>;,i可比较<;T>;实施SortedList抛出异常

C# 我的IEquatable有什么问题<;T>;,i可比较<;T>;实施SortedList抛出异常,c#,.net,icomparable,iequatable,C#,.net,Icomparable,Iequatable,我正在在线解决一个难题,偶然发现了这个问题,给定一个2D矩阵和一个数字k,我需要返回矩阵中的第k个最小元素 matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, return 13. 我可以用自己的二进制堆实现来解决这个问题。因为我正在准备面试,所以我不确定在所有情况下实现自己的Heap是否都是一个可接受的解决方案。所以我尝试用SortedList/SortedS

我正在在线解决一个难题,偶然发现了这个问题,给定一个2D矩阵和一个数字k,我需要返回矩阵中的第k个最小元素

 matrix = [
       [ 1,  5,  9],
       [10, 11, 13],
       [12, 13, 15]
    ],
    k = 8,

return 13.
我可以用自己的二进制堆实现来解决这个问题。因为我正在准备面试,所以我不确定在所有情况下实现自己的Heap是否都是一个可接受的解决方案。所以我尝试用SortedList/SortedSet解决这个问题

我基本上是在创建一个点对象,它采用索引I,j和I,j处的值。我已经实现了IComparable和IEquatable。但出于某种原因,在上面的示例中,索引1,2(值13)的Point对象和索引2,1(值13)的Point对象被认为是相等的,而它们本不应该相等。当使用SortedList时,我得到一个ArgumentException,SortedSet同时会覆盖现有对象。我的IEquatable、IComparable实现是否错误?我仔细检查了它们是否生成了不同的哈希代码

另外,这不是家庭作业问题。我正在在线面试准备平台上解决问题

public class Solution {
    public int KthSmallest(int[,] matrix, int k) {
        int rows = matrix.GetLength(0);
        int cols = matrix.GetLength(1);
        SortedSet<Point> pq = new SortedSet<Point>();
        bool[,] visited = new bool[rows, cols];
        int count = 1;
        int i=0, j=0;
        var start = new Point(i, j, matrix[i, j]);
        pq.Add(start);
        visited[0, 0] = true;
        while(true) {
            k--;
            var curr = pq.Min;
            pq.Remove(pq.First());
            if(k == 0)
                return curr.val;
            i = curr.x + 1;
            j = curr.y;
            if(i < rows && j < cols && !visited[i, j]) {
                var next = new Point(i, j, matrix[i, j]);
                Console.WriteLine(next.GetHashCode());
                Console.WriteLine(i+", "+j+", "+next.val);
                pq.Add(next);
                visited[i, j] = true;
            }
            i = curr.x;
            j = curr.y + 1;
            if(i < rows && j < cols && !visited[i, j]) {
                var next = new Point(i, j, matrix[i, j]);
                Console.WriteLine(next.GetHashCode());
                Console.WriteLine(i+", "+j+", "+next.val);
                pq.Add(next);
                visited[i, j] = true;
            }
        }
    }
}


public class Point : IComparable<Point>, IEquatable<Point>
{
    public int x { get; private set; }
    public int y { get; private set; }
    public int val { get; private set; }

    public Point(int x, int y, int val)
    {
        this.x = x;
        this.y = y;
        this.val = val;
    }

    public int CompareTo(Point that)
    {
        if(this.val == that.val) {
            if(this.x == that.x) {
                return this.y.CompareTo(that.y);
            }
            else {
                this.x.CompareTo(that.x);
            }
        }
        return val.CompareTo(that.val);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((Point)obj);
    }

    public bool Equals(Point p1) {
        return x == p1.x && y == p1.y && val == p1.val;
    }

    public override int GetHashCode() {
        long hashCode = ((x * 31 + y) * 31 + val);
        return hashCode.GetHashCode();
    }
}
公共类解决方案{
公共整数KthSmallest(整数[,]矩阵,整数k){
int rows=matrix.GetLength(0);
int cols=matrix.GetLength(1);
SortedSet pq=新的SortedSet();
bool[,]访问=新bool[行,列];
整数计数=1;
int i=0,j=0;
var起点=新点(i,j,矩阵[i,j]);
pq.添加(开始);
已访问[0,0]=真;
while(true){
k--;
变量电流=pq.Min;
pq.Remove(pq.First());
如果(k==0)
返回当前值;
i=当前x+1;
j=货币y;
如果(i
您的CompareTo中缺少返回语句。我在下面评论了你的原创作品,还有一个修改过的版本。在比较[2,1]和[1,2]的情况下,x值不匹配,但是当您点击this.x.CompareTo时,您实际上从未返回该比较,因此您的值比较将返回

你有:

public int CompareTo(Point that)
    {
        if(this.val == that.val) {
            if(this.x == that.x) {
                return this.y.CompareTo(that.y);
            }
            else {
                //****MISSING RETURN STATEMENT - 
                //will return the val.ComapreTo statement after 
                //it leaves this block*****
                this.x.CompareTo(that.x);
            }
        }
        return val.CompareTo(that.val);
    }
你需要:

public int CompareTo(Point that)
    {
        if(this.val == that.val) {
            if(this.x == that.x) {
                return this.y.CompareTo(that.y);
            }
            else {
                return this.x.CompareTo(that.x);
            }
        }
        return val.CompareTo(that.val);
    }

抢手货这确实是问题所在。