float []的ArrayList,无法检查ArrayList中是否包含float []

时间:2011-10-20 16:06:55

标签: java arraylist floating-point

我有一个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");
    }
}

3 个答案:

答案 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;
   }
}