2013-04-29 3 views
15

У меня есть объект A{int elementA; int elementB}. Эти объекты хранятся в arraylist, ArrayList<A> listObj.Проверьте, если java arraylist содержит объект

Как я могу выполнить операцию, используя только часть объекта A, например. учитывая только elementA для поиска, если объект newA{elementA} уже есть в списке?

Для объекта A Я определил равный, где я рассматриваю только elementA (часть объекта A), однако этого недостаточно.

Итак, было бы неплохо получить некоторые идеи, как их можно применять и использовать для частей объектов? (запись моей собственной функции является опцией, однако интересной, если стандартная функциональность может справиться с этой проблемой)

+0

Показать свой метод 'equals'. – NINCOMPOOP

+0

Если вы правильно переопределили equals(), то listObj.contains (новый A (elemAvalue)) должен работать. Обратите внимание, что вы также должны переопределить hashCode только с учетом значения elementA, хотя это не является функционально релевантным для этого примера. – misberner

+0

'if (! Days.contains (getDate())) { days.add (getDate()); } ' –

ответ

0

hashCode() и equals() из массивов немного сломаны, когда дело доходит до этого (почему это происходит по-разному).

Возможная работа вокруг заключается в использовании ArrayList<ArrayList<String>> вместо ArrayList<String[]>, метод equals() для ArrayList будет таким, как вы ожидаете.

Например:

ArrayList<String> l1 = new ArrayList<>(); 
    ArrayList<String> l2 = new ArrayList<>(); 
    l1.add("asdf"); 
    l2.add("asdf"); 
    ArrayList<ArrayList<String>> coll = new ArrayList<>(); 
    coll.add(l1); 
    System.out.println(coll.contains(l2)); 

будет давать так, как ожидалось

Также см ниже ссылке

Most efficient way to see if an ArrayList contains an object in Java

21

List#contains() метод использует метод equals(), чтобы оценить, если два объекта являются одна и та же. Таким образом, вам необходимо переопределить equals() в вашем классе A, а также переопределить hashCode().

@Override 
public boolean equals(Object object) 
{ 
    boolean isEqual= false; 

    if (object != null && object instanceof A) 
    { 
     isEqual = (this.elementA == ((A) object).elementA); 
    } 

    return isEqual; 
} 

@Override 
public int hashCode() { 
    return this.elementA; 
} 
+0

Это работает отлично, пока вы должны сравнивать элементы A, но как только это изменится, вы можете отказаться от этого, не говоря уже о том, что вы можете использовать методы equals или hashcode в других местах, я бы пошел с компаратором это точно. –

+2

Справедливо! Но List 'contains()' использует метод 'equals', а не' Comparable.compareTo() '! – NINCOMPOOP

+0

Спасибо за решение. Для таких новичков, как я: Если 'elementA' - это тип' String', то используйте 'isEqual = (this.elementA.equals (((A) object) .elementA));' –

0

Я бы не переопределить equals для этого. Хотя {1, 1} и {1, 2} не могут встречаться в вашем списке, два объекта: не равно.

Я бы использовать Map вместо:

Map<Integer, A> map = new HashMap<>(); 
A a1 = new A(1, 1); 
A a2 = new A(1, 2); 

map.put(a1.elementA, a1); 

// test if key is contained 
boolean contains = map.containsKey(a2.elementA); 

// overwrite a1 with a2 
map.put(a2.elementA, a2); 
3

Вы можете адаптировать свой equals чтобы приспособить для ваших потребностей, но вы также можете использовать один из мощных библиотек коллекции, которая уже существует, как commons-collections, Guava или lambdaj , Все они имеют конструкции итераций и предикатов, которые позволяют вам «исследовать» ваши коллекции на основе некоторого предиката.

Пример с Commons Коллекции:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() { 
    public boolean evaluate(A theA) { 
     // Do the comparison 
    } 
}); 
0

Все вышеизложенное решение будет подходит ваш вопрос. Что я хотел бы предложить вам здесь? Когда вы используете коллекцию, всегда добавляйте свой переменный тип данных к своему суперклассу. который поможет вам сделать больше манипуляций и преобразовать их в любой из своих подклассов.

Ex: 
List<String> myList = new ArrayList<String>(); 

Преимущество, что реализация списка может измениться (на LinkedList, например), не затрагивая остальную часть кода. Это будет сложно сделать с ArrayList, не только потому, что вам придется менять ArrayList на LinkedList повсюду, но также и потому, что вы, возможно, использовали специальные методы ArrayList.

0

Для сравнения значения объекта в arrayList. Следуйте за этой ссылкой. How to compare Objects attributes in an ArrayList?

Я надеюсь, что это решение вам поможет. Thanks

+0

Это не должно быть установлено как ответ I предположим, но как комментарий. – NatNgs

+0

Вы не можете просто ссылаться на ответ. Вы должны дать ответ здесь. –

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18543188) –