检查数组列表中是否有两个对象相等

时间:2015-10-10 21:07:48

标签: java class arraylist constructor

我有一个主类,它创建一个Element类型的arraylist:

public static void main(String[] args) throws IOException {
String input = "";
String id = ""; //combination of letters and numbers
String name = "";

ArrayList<Element> element = new ArrayList<> ();

BufferedReader in = new BufferedReader( new InputStreamReader(System.in));

while(!(input.equalsIgnoreCase("quit"))) {
    System.out.println("Please enter 'e' to enter an element, or 'quit' to quit");
    input = in.readLine();

if(input.equalsIgnoreCase("e")) {

    System.out.println("Please enter a name for the element");
    name = in.readLine();

    System.out.println("Please enter an id for the element");
    id = in.readLine(); 

    element.add(new Element(name,id));
    //only add if id and name don't exist already
}

}

}

然后我有一个元素clas:

public class Element {

private String name;
private String id;

public Element(String name, String id) {

this.name = name;
this.id = id;

}


}

我想在将一个元素添加到列表(它的id和名称)之前检查,以检查列表中已有的另一个元素是否已经具有那些确切的值(id和name)。我知道我可以使用toString方法来执行此操作,但在将元素添加到列表之前,我不确定如何覆盖它以传递id和名称。他们是这样做的吗?理想情况下,我只想添加一个元素,如果它还不存在的话。

3 个答案:

答案 0 :(得分:2)

您应该使用$sth。它是一个完全符合您要求的数据结构 - 它不能包含重复项。为了使该集合有效,您应该正确实现类的Setequals()方法。

答案 1 :(得分:1)

以下被覆盖的equals方法可行。

public class Element {
    private String name;
    private String id;

    public Element(String name, String id) {
        this.name = name;
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Element){
            Element element = (Element) obj;
            if(element != null && this.name.equals(element.name) && this.id.equals(element.id)){
                return true;
            }
        }
        return false;
    }
  }

然后在添加到列表之前尝试检查,如下所示:

        ArrayList<Element> element = new ArrayList<Element> ();
        Element element1 = new Element("a", "1");
        Element element2 = new Element("b", "2");
        Element element3 = new Element("b", "2");
        element.add(element1);
        element.add(element2);
        if(element.contains(element3)){
            System.out.println("Yes");
        } else{
            System.out.println("No");
        }

<小时/> 时间概念:

以下是Java的contains实现:

应该关注你的部分是这个 - o.equals(elementData[i]。对象的内部equals方法将用于执行等于检查,如果您没有覆盖equals方法,那么将比较2个对象的内存位置,并且因为它将是不同的{{1 }}将返回ArrayList.contains,因此通过覆盖false方法,我们建立了一个关于何时将2 equals个对象视为相同的逻辑条件。

Element

答案 2 :(得分:0)

覆盖equals类的Element方法。使用contains的{​​{1}}方法检查元素是否已在列表中。