我有一個代碼:同樣的結構有不同的hashCode
public class Point
{
public int x;
public int y;
public Point() { x = 0; y = 0; }
public Point(int a, int b) { x = a; y = b; }
}
public struct Coefficients{
public double a;
public double b;
public double c;
public Coefficients(double a, double b, double c)
{
this.a = a;
this.b = b;
this.c = c;
}
public static Coefficients GetFromPoints(Point point1, Point point2)
{
int x1 = point1.x;
int x2 = point2.x;
int y1 = point1.y;
int y2 = point2.y;
double a = y1- y2;
double b = x2 - x1;
double c = x1 * y2 - y1 * x2 ;
double max = Math.Max(Math.Max(a, b), c);
double min= Math.Min(Math.Min(a, b), c);
double divider = Math.Abs(max)> Math.Abs(min)?max:min;
divider = Math.Abs(divider) > 1? divider : 1;
return new Coefficients(a/divider, b/divider, c/divider);
}
}
public class Solution
{
public int MaxPoints(Point[] points)
{
var coef_list = new List<Coefficients>();
for (var x = 0; x < points.Length - 1; x++)
{
for (var y = x + 1; y < points.Length; y++)
{
var coef = Coefficients.GetFromPoints(points[x], points[y]);
coef_list.Add(coef);
}
}
foreach (var item in coef_list) {
Debug.WriteLine(item.a);
Debug.WriteLine(item.b);
Debug.WriteLine(item.c);
Debug.WriteLine(item.GetHashCode());
Debug.WriteLine("---------------");
}
return 0;
}
}
正如你可以看到我使用struct和我說怪異的行爲。 如果我有這樣的輸入數據:
prg.MaxPoints(new Point[] { new Point(4, -1), new Point(4, 0), new Point(4, 5) });
調試輸出是:
-0,25
0
1
-450335288
---------------
-0,25
0
1
-450335288
---------------
-0,25
0
1
-450335288
---------------
但如果我改變ARGS。爲了:
prg.MaxPoints(new Point[] { new Point(4, 0),new Point(4, -1) , new Point(4, 5) });
調試的是:
-0,25
0
1
1697148360
---------------
-0,25
0
1
-450335288
---------------
-0,25
0
1
-450335288
---------------
而且有一件事情是很重要的是,在第一種情況下,我們有所有的「分隔」(GetFromPoints法)是正(4 ,24,20)在第二種情況下,其中一個爲負數,另外兩個爲正數(-4,20,24)。 有人可以解釋這一點嗎?
UPD。 當我改變
return new Coefficients(a/divider, b/divider, c/divider);
到
return new Coefficients(a/divider, 0, c/divider);//anyway in all of these cases 2-nd argument is 0
這意味着0由負分割不爲0?
是的,但我認爲具有相同字段的結構應該是相等的,但它們不是。 '調試。寫入(coef_list [0] .a.Equals(coef_list [1] .a)); Debug.WriteLine(coef_list [0] .b.Equals(coef_list [1] .b)); Debug.WriteLine(coef_list [0] .c.Equals(coef_list [1] .c)); 的Debug.WriteLine(coef_list [0] .Equals(coef_list [1]));' 顯示 '真 真正 真正 FALSE' –
他們是不相等的,你的數學給你一個舍入誤差,所以' - 0,25'可能不是。當輸出a,b和c值時,使用'.ToString(「G17」)' –
偷看字節,看起來可能是某種下溢,因爲它們不完全相同字節,但給出理論上相等的值。在第一種情況下,第一個組件的「b」正好爲零:「0 0000000000000000」,而在第二種情況下,它略有不同:「0 0000000000000080」。 –