在List <object []> </object []>中查找唯一条目

时间:2012-01-30 13:25:29

标签: java unique hashset

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}

如何在此示例中查找唯一条目?

6 个答案:

答案 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;
}

然后,您可以覆盖方法equalshashCode,以便从您的集合中获得预期的行为

答案 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);
    }


}