有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

arraylist列表<MyModel>。包含(MyModel)java不工作

我的课程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)

我做了一些搜索,我知道contains使用了equals,但我正在找到正确的方法来找到解决方案。 提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    检查包含的唯一方法是重写equals()方法。如果您检查contains方法是如何在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()方法只是遍历列表中的元素,并在MyModel类中调用equals()方法

    因此,如果不重写对象类中的equals()方法,就没有其他方法可以检查contains

  2. # 2 楼答案

    如果查看ArrayList类中contains的实现,您会看到它在内部使用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;
    }
    

    因此,您需要为MyModel类创建equalshashCode。您可以借助您正在使用的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);
        }
    }
    
  3. # 3 楼答案

    尝试运行以下代码,我已经对其进行了修改并添加了日志,现在您可以检查控制台上打印的输出: 我建议您使用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));