List<Object> listObj = new ArrayList<Object[]>();
listObj.add(new Object[]{1,"abc",new Date(21/1/2001)});
listObj.add(new Object[]{1,"abc",new Date(21/1/2001)});
listObj.add(new Object[]{2,"acc",new Date(21/1/2001)});
Set<Object[]> unique = new HashSet<Object[]>();
unique.addAll();
我希望得到:
{1,abc,21/1/2001},{2,acc,21/1/2001}
相反,我得到:
{1,abc,21/1/2001},{1,abc,(21/1/2001},{2,acc,21/1/2001}
如何在此示例中查找唯一条目?
答案 0 :(得分:6)
Java中的数组没有允许它工作的相等概念。您需要定义一个带有数字,字符串和日期的自定义类,并自己实现equals / hashCode以允许它工作。
答案 1 :(得分:1)
您可以使用自定义TreeSet
初始化的Comparator
来执行您需要的检查;没有办法使用数组和默认比较器。
答案 2 :(得分:0)
最简单的方法是使用Set
。我强烈建议创建一个类来捕获你的int,string和date对象
public class Foo {
private int num;
private String letters;
private Date date;
}
然后,您可以覆盖方法equals
和hashCode
,以便从您的集合中获得预期的行为
答案 3 :(得分:0)
我会将对象数组中的所有数据封装到POJO中 在POJO中,您可以定义自己的等于方法。 e.g
public class Bean {
private int i;
private String l;
private Date d;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getL() {
return l;
}
public void setL(String l) {
this.l = l;
}
public Date getD() {
return d;
}
public void setD(Date d) {
this.d = d;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((d == null) ? 0 : d.hashCode());
result = prime * result + i;
result = prime * result + ((l == null) ? 0 : l.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Bean))
return false;
Bean other = (Bean) obj;
if (d == null) {
if (other.d != null)
return false;
} else if (!d.equals(other.d))
return false;
if (i != other.i)
return false;
if (l == null) {
if (other.l != null)
return false;
} else if (!l.equals(other.l))
return false;
return true;
}
}
答案 4 :(得分:0)
Java中的数组不会覆盖hashCode()
和equals()
,因此比较两个具有相同内容(具有相同长度和相同元素)的数组会意外地产生错误。
如果您使用List<Object>
,它应该可以正常工作。您可以利用Arrays.asList()
实用程序。
答案 5 :(得分:0)
您可以围绕Object[]
实施一个提供适当的hashCode()
和equals()
的精简包装器。这两种方法可以很容易地在Arrays.deepHashCode()
和Arrays.deepEquals()
:
public class Cmp {
public static class ObjArray {
private final Object[] arr;
public ObjArray(Object[] arr) {
this.arr = arr;
}
@Override
public int hashCode() {
return Arrays.deepHashCode(arr);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ObjArray other = (ObjArray)obj;
return Arrays.deepEquals(arr, other.arr);
}
}
public static void main(String args[]) {
List<ObjArray> listObj = new ArrayList<ObjArray>();
listObj.add(new ObjArray(new Object[]{1,"abc",new Date(21/1/2001)}));
listObj.add(new ObjArray(new Object[]{1,"abc",new Date(21/1/2001)}));
listObj.add(new ObjArray(new Object[]{2,"acc",new Date(21/1/2001)}));
Set<ObjArray> unique = new HashSet<ObjArray>();
unique.addAll(listObj);
System.out.println(unique);
}
}