ArrayList из float [], не может проверить, содержится ли float [] в ArrayList - PullRequest
1 голос
/ 20 октября 2011

У меня есть ArrayList<float[]>, внутри которого я размещаю массивы с плавающей точкой, хранящие декартовы значения строки, т. Е. (X0, y0, x1, y1).

каждый раз, когда я выполняю .contains ()с массивом с плавающей точкой возвращает 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 ]

4 голосов
/ 20 октября 2011

Это потому, что 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}
0 голосов
/ 20 октября 2011

Вам необходимо реализовать метод, который проверяет, совпадает ли содержимое обоих векторов:

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;
   }
}
0 голосов
/ 20 октября 2011

Вы можете написать собственную функцию для задачи:

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)) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...