1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math.stat.clustering;
19
20 import java.io.Serializable;
21 import java.util.Collection;
22
23 import org.apache.commons.math.util.MathUtils;
24
25
26
27
28
29
30 public class EuclideanIntegerPoint implements Clusterable<EuclideanIntegerPoint>, Serializable {
31
32
33 private static final long serialVersionUID = 3946024775784901369L;
34
35
36 private final int[] point;
37
38
39
40
41
42
43 public EuclideanIntegerPoint(final int[] point) {
44 this.point = point;
45 }
46
47
48
49
50
51 public int[] getPoint() {
52 return point;
53 }
54
55
56 public double distanceFrom(final EuclideanIntegerPoint p) {
57 return MathUtils.distance(point, p.getPoint());
58 }
59
60
61 public EuclideanIntegerPoint centroidOf(final Collection<EuclideanIntegerPoint> points) {
62 int[] centroid = new int[getPoint().length];
63 for (EuclideanIntegerPoint p : points) {
64 for (int i = 0; i < centroid.length; i++) {
65 centroid[i] += p.getPoint()[i];
66 }
67 }
68 for (int i = 0; i < centroid.length; i++) {
69 centroid[i] /= points.size();
70 }
71 return new EuclideanIntegerPoint(centroid);
72 }
73
74
75 @Override
76 public boolean equals(final Object other) {
77 if (!(other instanceof EuclideanIntegerPoint)) {
78 return false;
79 }
80 final int[] otherPoint = ((EuclideanIntegerPoint) other).getPoint();
81 if (point.length != otherPoint.length) {
82 return false;
83 }
84 for (int i = 0; i < point.length; i++) {
85 if (point[i] != otherPoint[i]) {
86 return false;
87 }
88 }
89 return true;
90 }
91
92
93 @Override
94 public int hashCode() {
95 int hashCode = 0;
96 for (Integer i : point) {
97 hashCode += i.hashCode() * 13 + 7;
98 }
99 return hashCode;
100 }
101
102 }