我有一个ArrayList<float[]>
里面放置一个浮点数组,存储一行的笛卡尔值,即(x0,y0,x1,y1)。
每次执行.contains()时,使用float数组都返回false,即使我在调试器中看到它存在。所以似乎是在比较内存参考而不是实际值。有什么方法可以比较这些值吗?
public static void main (String[] args) {
ArrayList <float[]>drawnLines = new ArrayList<float[]>();
float[] line = new float[4];
line[0] = (float)5;
line[1] = (float)12;
line[2] = (float)55;
line[3] = (float)66;
drawnLines.add(line);
float[] linea = new float[4];
linea[0] = (float)5;
linea[1] = (float)12;
linea[2] = (float)55;
linea[3] = (float)66;
if (drawnLines.contains(linea)) {
System.out.println("contians");
}
else {
System.out.println(" does not contian");
}
}
答案 0 :(得分:4)
这是因为line.equals(linea)
是假的。
您需要将float[]
包含在一个类中,该类定义您的意思相等。
然而,似乎使用像Line这样的类是更好的选择。
public static void main(String[] args) {
List<Line> drawnLines = new ArrayList<Line>();
drawnLines.add(new Line(5, 12, 55, 66));
Line linea = new Line(5, 12, 55, 66);
if (drawnLines.contains(linea))
System.out.println("contains " + linea);
else
System.out.println(" does not contain " + linea);
}
static class Line {
final float x0, y0, x1, y1;
Line(float x0, float y0, float x1, float y1) {
this.x0 = x0;
this.y0 = y0;
this.x1 = x1;
this.y1 = y1;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Line line = (Line) o;
if (Float.compare(line.x0, x0) != 0) return false;
if (Float.compare(line.x1, x1) != 0) return false;
if (Float.compare(line.y0, y0) != 0) return false;
return Float.compare(line.y1, y1) == 0;
}
@Override
public String toString() {
return "Line{" + "x0=" + x0 + ", y0=" + y0 + ", x1=" + x1 + ", y1=" + y1 + '}';
}
}
打印
contains Line{x0=5.0, y0=12.0, x1=55.0, y1=66.0}
答案 1 :(得分:0)
您可以为任务编写自己的函数:
boolean listContains(List<float[]> list, float[] arr) {
for (float[] elem : list) {
if (Arrays.equals(elem, arr)) {
return true;
}
}
return false;
}
要在代码中使用它,请更改
if (drawnLines.contains(linea)) {
到
if (listContains(drawnLines, linea)) {
答案 2 :(得分:0)
您需要实现一种方法来检查两个向量的内容是否相同:
private static boolean isTheSameVector(float [] vect1, float [] vect2){
if (vect1.length != vect2.length) {
return false;
} else {
for (int i=0; i< vect1.length; i++) {
if (vect1[i] != vect2[i]) {
return false;
}
}
return true;
}
}