搜索存储自定义对象的ArrayList

时间:2015-09-01 14:11:18

标签: java arrays list object search

我有一个名为字母表的自定义类。

public class Alphabets {
    String alp;

    public Alphabets(String alp) {
        this.alp = alp;
    }

    public String getAlp() {
        return alp;
    }
}

我有两个ArrayLists包含自定义对象,或者每个都输入(String& Alphabets)。

ArrayList<Object> ar = new ArrayList<>();
ArrayList<Object> br = new ArrayList<>();

Alphabets a = new Alphabets("A");
Alphabets b = new Alphabets("B");
Alphabets b_clone = new Alphabets("B");

ar.add(a);
ar.add(b);

br.add(b_clone);

System.out.println(ar.contains(br.get(0)));

输出为false,技术上正确,但对象中包含的实际值相等(&#34; B&#34;在这种情况下)。这当然只是代码片段。我需要检查两个整个ArrayLists以查看一个列表是否包含来自另一个列表的对象,因此无法使用内置的.contains函数。 有没有一种快速方法或任何解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:1)

从List.contains方法的文档中读取

  

如果此列表包含指定的元素,则返回true。更正式的,
     当且仅当此列表至少包含时,才返回true      一个元素e使得(o == null?e == null:o.equals(e))。

所以你需要做的就是重写Alphabets类的equals和hashcode方法。

public class Alphabets {
    String alp;

    public Alphabets(String alp) {
        this.alp = alp;
    }

    public String getAlp() {
        return alp;
    }

    // Override the equals method as you need it and contains will be able to use it.
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Alphabets) {
            Alphabets aObj = (Alphabets) obj;
            //
            return aObj.getAlp().equals(getAlp());

        } else {
            return false;
        }
    }

     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
         result = prime * result + ((alp == null) ? 0 : alp.hashCode());
         return result;
     }
}

现在您可以构建两个ArrayLists的交集,并且可以像这样简单地检查ArrayList的大小:

public static void main(String args[]){  
    ArrayList<Object> ar = new ArrayList<>();
    ArrayList<Object> br = new ArrayList<>();



    Alphabets a = new Alphabets("A");
    Alphabets b = new Alphabets("B");
    Alphabets b_clone = new Alphabets("B");

    ar.add(a);
    ar.add(b);

    br.add(b_clone);

    ArrayList<Object> ar2 = (ArrayList<Object>) ar.clone();

    ar2.retainAll(br);

    // Size 0 = no elements are equal
    // Size > 0 = equal elemts found
    System.out.println(ar2.size());

}

编辑:在侧节点上,不要使用rawtypes

答案 1 :(得分:1)

覆盖hashCode和等值方法

public class Alphabets {
    String alp;

    public Alphabets(String alp) {
    this.alp = alp;
    }

    public String getAlp() {
    return alp;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((alp == null) ? 0 : alp.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Alphabets other = (Alphabets) obj;
        if (alp == null) {
            if (other.alp != null)
                return false;
        } else if (!alp.equals(other.alp))
            return false;
        return true;
    }
}

现在

public class TestProgram {

    public static void main(String[] args){
        ArrayList<Object> ar = new ArrayList<>();
        ArrayList<Object> br = new ArrayList<>();

        Alphabets a = new Alphabets("A");
        Alphabets b = new Alphabets("B");
        Alphabets b_clone = new Alphabets("B");

        ar.add(a);
        ar.add(b);

        br.add(b_clone);

        System.out.println(ar.contains(br.get(0))); // Prints true
    }
}