выяснить тип массива для сравнения массивов в Java - PullRequest
3 голосов
/ 13 октября 2011

Я пытаюсь написать метод для сравнения двух массивов в Java без использования .equals ().

После сравнения размера / длины массивов я хочу отсортировать их (предполагая, что они имеют одинаковый размер), но я не знаю, какой тип данных хранится в каждом массиве. Как я могу понять это для выполнения .sort ()?

Мне пришло в голову, что я, возможно, могу выполнить deepToString () и не беспокоиться о реальном типе, поскольку я сравниваю только массивы здесь.

if(array1.length = array2.length)
{
    //figure out array type to perform sorts???
    array1.sort(TYPE[]);
    array2.sort(TYPE[]);
    for(int i = 0; i < array1.size(); i++)
    {
        if(array1[i] != array2[i])
        {
            return false;
        }
        if(i = array1.size() - 1)
        {
            return true;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Я не знаю, какой тип данных хранится в каждом массиве.

Это сложный вопрос:

  • Вы можете получить тип первого элемента массива и посмотреть его тип; например,

    Тип класса = массив [0] .getClass ();

    Но нет гарантии, что все элементы массива будут иметь одинаковый (наиболее производный) тип.

  • Вы можете получить базовый тип массива; например,

    Класс type = array.getClass (). GetComponentType ();

    Но фактическим типом элементов может быть любой подтип этого типа.

Как я могу понять это для выполнения .sort ()?

Даже если вам удастся получить фактический тип элементов (и все они имеют одинаковый тип), вы все равно застряли. Просто зная, что этот тип (в общем) не позволит вам их отсортировать. Для сортировки массива вам понадобится одно из следующих:

  • Тип элемента должен реализовывать интерфейс Comparable.

  • Вы должны предоставить отдельный Comparator объект.

Я думаю, что вам лучше всего забыть о типах и выполнить одно из следующих действий:

  • Просто позвоните Arrays.sort(Object[]). Это работает, если все элементы массива реализуют Comparable, и элементы взаимно сопоставимы.

  • Внедрить и использовать класс компаратора. Теоретически, это может быть «универсальный» компаратор, который может упорядочить любую пару объектов, которые вы можете встретить в массиве. Но лучшей идеей было бы реализовать несколько компараторов и передать соответствующий метод в метод равенства как параметр или что-то подобное.

0 голосов
/ 13 октября 2011
Class type1 = array1[0].getClass();
Class type2 = array2[0].getClass();
if(type1!=type2)
    return false;

Но ваш подход не использовать equals() плох.Не зная, какие объекты находятся в массиве, использование оператора == (или! =) Возможно только для сравнения адресов объектов (если они не являются примитивными типами).

Запуск вашей функции на

array1 = {"a", "b", "c"};
array2 = {"a", "b", "c"};

вернет false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...