Как мне найти один массив, содержимое которого соответствует другому? - PullRequest
0 голосов
/ 08 августа 2011

У меня есть ArrayList из массивов int, который возвращает false, когда я спрашиваю, содержит ли он указанные координаты. содержит координаты, которые я запрашиваю, поэтому он должен возвращать TRUE.

Вот мой код.

    //debug code
    for (int i = 0; i < Locations.size(); i++)
    {
        int[] TestLoc = Locations.get(i);

        System.out.print(TestLoc[0] + " " + TestLoc[1] + " " + TestLoc[2] + " == " + Location[0] + " " + Location[1] + " " + Location[2] + "? - ");

        if (Location == TestLoc)
        {
            System.out.println("TRUE");
        }

        else
        {
            System.out.println("FALSE");
        }
    }

    //real code
    if (Locations.contains(Location))
    {
        Locations.remove(Location);
    }

    else
    {
        System.out.println("FAIL");
    }

И вывод, запрашивая координаты 57, 64, 105, когда список содержит 4 координаты.

56 64 105 == 57 64 105? - ЛОЖЬ

56 64 106 == 57 64 105? - ЛОЖЬ

56 64 107 == 57 64 105? - ЛОЖЬ

57 64 105 == 57 64 105? - ЛОЖЬ

Что дает ???

Ответы [ 6 ]

7 голосов
/ 08 августа 2011

Равные массивы Java равны идентичности.Вам нужно создать фактический Coordinate класс.

Поместить по-другому:

int[] c1 = new int[] { 1, 2 };
int[] c2 = new int[] { 1, 2 };
System.out.println(c1.equals(c2)); // prints false
3 голосов
/ 08 августа 2011

Массивы в Java являются объектами.

Когда вы используете оператор ==, вы сравниваете, является ли Location тем же массивом, что и Testloc, но это не так.Что вы действительно хотите, так это сравнить значения в каждом массиве, чтобы увидеть, равны ли они.

Вместо того, чтобы писать свои собственные, вы можете использовать статический метод Arrays.equals(), чтобы сравнить двадля равенства.

3 голосов
/ 08 августа 2011

Лучше всего было бы получить класс данных, например, Coordinate для хранения ваших данных и переопределить метод equals. Другой вариант, если вы просто храните телефонные номера, может состоять в том, чтобы использовать строки для представления хорошо отформатированных телефонных номеров и использовать метод equals класса String.

2 голосов
/ 08 августа 2011

Похоже, проблема в следующей строке:

if (Location == TestLoc)

Предположительно, TestLoc - это массив целых чисел, Location также привязан к массиву.

Приведенный выше тест вернет true, только если переменные TestLoc и Location обе указывают на один и тот же экземпляр массива , и не вернет true, если эти две переменные указывают на другой массив случаи , что оба имеют одинаковые целые числа в одинаковых позициях. Вы тестируете "ссылочное равенство" выше - спрашивая, только если эти две вещи одинаковы вещь & mdash; в отличие от "равенства равенства", которое спрашивает, являются ли две вещи эквивалентными , независимо от того, представлены ли они как два отдельных объекта в области памяти компьютера.

В некоторых языках программирования нет такого различия, а некоторые позволяют определять новые типы, которые лучше рассматривать как значения - где идентичность несущественна - чем как сущности, где идентичность может быть важнее любой потенциальной эквивалентности значений. Java использует отдельный метод & mdash; Object#equals() & mdash; для запроса эквивалентности или равенства значений для экземпляров Object, тогда как оператор == всегда выполняет только одно: он оценивает равенство значений любых двух вещей, даже если эти вещи ссылки на объекты .

Следовательно, при сравнении двух экземпляров массива, как вы здесь, оба из которых являются неким типом Object, оператор == спрашивает, не эквивалентны ли две вещи , указанные на этими ссылками, эквивалентны , а точнее, эквивалентны ли значения самих ссылок . Если они указывают на один и тот же целевой объект, они эквивалентны, но если они этого не делают, не имеет значения, будут ли два разных целевых объекта выглядеть одинаковыми по значению; == возвращает false, поскольку два целевых объекта представлены различными ссылками.

1 голос
/ 08 августа 2011

Это работает для меня:

List<int[]> l = new ArrayList<int[]>();
    l.add(new int[] {56, 64, 105});
    l.add(new int[] {56, 64, 105});
    l.add(new int[] {56, 64, 105});
    for (int i = 0; i < l.size(); i++)
    {
        int[] t = l.get(i);

        if (l.get(i) == t)
        {
            System.out.println("TRUE");
        }

        else
        {
            System.out.println("FALSE");
        }
    }
1 голос
/ 08 августа 2011

Сравнивая массивы с ==, вы проверяете, являются ли они одним массивом.Вам нужно было бы пройти через каждый массив и проверить TestLoc [i] == Location [i].Возможно, вы сможете использовать .equals (), я не помню, есть ли в java .equals () для массивов

...