Список <MyModel>.contains (MyModel) Java не работает - PullRequest
0 голосов
/ 02 марта 2019

У меня есть мой класс MyModel, который содержит:

private int value;

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

Теперь я заполнил класс MyModel:

private final List<MyModel> listModel = new ArrayList<>();
private Mymodel myModel;

 myModel= new MyModel ();
 myModel.setValue(1);
 myModel.setValue(2);
 myModel.setValue(3);
 listModel.add(myModel);

Я хочу узнать, содержит ли listModel myModel

listModel.contains(myModel)

Я провел некоторый поиск и знаю, что содержит использование равных, но я нахожу правильный способ найти решение.Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Единственный способ проверить наличие содержимого - переопределить метод equals().Если вы проверите, как реализован метод в ArrayList, вы можете легко узнать это.Метод contains() вызовет метод indexOf(), который вернет индекс элемента в списке.Если индекс больше 0, то метод contains() вернет true.

Посмотрим, как реализован метод indexOf().

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

Это означает, что метод indexOf()просто обход элементов в списке и вызов метода equals() в вашем классе MyModel.

Таким образом, нет другого способа проверки содержимого без переопределения метода equals() из класса Object

0 голосов
/ 02 марта 2019

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

class MyModel {
private int value;

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

@Override
public String toString() {
    return "MyModel{" +
            "value=" + value +
            '}';
}

}

final List<MyModel> listModel = new ArrayList<>();
    MyModel myModel;

    myModel= new MyModel();
    myModel.setValue(1);
    myModel.setValue(2);
    myModel.setValue(3);
    listModel.add(myModel);
    //here your myModel object has '3' value and list has [3], So this will return `true`
    System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));

    myModel= new MyModel();
    myModel.setValue(8);
    listModel.add(myModel);
    //here your myModel object has '8' value and list has [3,8], So this will return `true`
    System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));

    myModel= new MyModel();
    myModel.setValue(100);
    //here your myModel object has '100' value and list has [3,8], So this will return `false`
    System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));
0 голосов
/ 02 марта 2019

Если вы посмотрите на реализацию contains в ArrayList классе, вы увидите, что внутренне он использует метод equals для поиска объекта:

public boolean contains(Object o) {
    return indexOf(o) >= 0;
}

public int indexOf(Object o) {
    return indexOfRange(o, 0, size);
}

int indexOfRange(Object o, int start, int end) {
    Object[] es = elementData;
    if (o == null) {
       ...
    } else {
        for (int i = start; i < end; i++) {
            if (o.equals(es[i])) { //calling overridden equals of the object instance, else it will revert to the Object's equals which simply compares the reference 
                return i;
            }
        }
    }
    return -1;
}

Итак, вы 'Вам нужно будет создать equals и hashCode для вашего MyModel класса.Вы можете воспользоваться помощью IDE, которую вы используете для ее создания:

Например:

class MyModel{
    private int value;

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof MyModel)) return false;
        MyModel myModel = (MyModel) o;
        return value == myModel.value;
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
}
...