我有一个名为字母表的自定义类。
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函数。
有没有一种快速方法或任何解决方案来解决这个问题?
答案 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
}
}