Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Arrays.equals в ArrayList.contains 
:(
    Опции темы
solve
Дата 15.6.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Преамбула:
Есть класс OutputSymbol c перегруженными методами equals , hashcode
Есть список,елементами которого есть массивы объектов класса OutputSymbol
Код

 ArrayList<OutputSymbol[]> usedwords =new ArrayList<OutputSymbol[]>();

Цель- проверить,будет ли данный массив содержаться  в списке.
Проблема:
Если создать массив,занести его в список,а потом создать еще один массив с такими же елементами и проверить,если ли он в списке с помощью contains,то результат будет false
Например
Код

OutputSymbol[] array1=new OutputSymbol[]{new OutputSymbol(0)};
OutputSymbol[] array2=new OutputSymbol[]{new OutputSymbol(0)};
usedwords.add(array1);
System.out.println(usedwords.contains(array2);

результат будет false, что вполне понятно,потому как в методе containes используется equals, которые для массивов даст false.
Как я понимаю, применение Arrays.equals даст нужный результат:
Код

System.out.println(Arrays.equals(array2,usedwords.get(0)));

Даст true
Вопрос:
Как сделать корректную проверку на вхождение для списка с елементами-массивами?
Как я понимаю,можно наследовать новый класс от ArrayList и переопределить contains и indexOf, но есть ли альтернативные решения.
Заранее спасибо   





PM MAIL   Вверх
nornad
Дата 16.6.2007, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(solve @  15.6.2007,  20:34 Найти цитируемый пост)
но есть ли альтернативные решения.

Есть. Например, можно сделать хелпер, который и будет производить проверку. Пример:
Код

public class Helper
{
  public static boolean contains( ArrayList<OutputSymbol[]> list, OutputSymbol[] array ) {
    // перебираем список и при нахождении массива возвращаем true
  }
}


Добавлено через 2 минуты и 17 секунд
Но лично я бы вместо этого сделал для OutputSymbol[] свой класс-обёртку, у которого определил бы equals. Имхо, нехорошо в листе хранить "голые" массивы. Но аргументировать свою позицию не могу, а потому и не настаиваю. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
LSD
Дата 16.6.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Если есть возможность заменить List на Set, то можно использовать TreeSet со своим компаратором.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
solve
Дата 16.6.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Попробовал оба вариантаsmile
Вариант с классом- хелпером - именно то что нужно. 
Код

public class ArrayHelper {
     public static boolean contains( ArrayList<OutputSymbol[]> list, OutputSymbol[] array )
     {   boolean contains=false;
         for (OutputSymbol[] listArr : list){
        if (Arrays.equals(listArr,array)){
        contains=true;
        break;
     }

     }
     return contains;
}}

Спасибо за совет.

По поводу замены List  на Set:
Не уверен,что использование компаратора повлияет на contains  в множестве:
Написал такой вот класс
Код

public class ArrayComparator implements Comparator {
    public int compare(Object o1, Object o2) {
    int i;
    if (Arrays.equals((OutputSymbol[])o1,(OutputSymbol[])o2)){
    i=0;
    }
    else
    if(o1.hashCode()<o2.hashCode())
    i=-1;
    else i=1;

    return i;
  }

}



Проверил его на имеющихся массивах:
Код

ArrayComparator a=new ArrayComparator();
System.out.println(a.compare(array2,usedwords.get(0)));


Получил 0. то есть вроде как равны(так оно и есть на самом деле).

Теперь задаем множество c компаратором:
Код

TreeSet<OutputSymbol[]> usedwords2 =new TreeSet<OutputSymbol[]>(new ArrayComparator());
System.out.println(usedwords2.contains(array2));

Дает false

То есть даже если компаратор считает елементы равными, в TreeSet.containes все равно считает их разными
Или я что-то не так делаю?
PM MAIL   Вверх
LSD
Дата 16.6.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(solve @  16.6.2007,  15:03 Найти цитируемый пост)
Или я что-то не так делаю?

У тебя отношение задаваемое компаратором не транзитивно (если a > b и b > c, то a > c, а у тебя это не так).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.