Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查ArrayList中是否存在对象_Java_Android_Arraylist - Fatal编程技术网

Java 检查ArrayList中是否存在对象

Java 检查ArrayList中是否存在对象,java,android,arraylist,Java,Android,Arraylist,每x秒,我在Android应用程序中检查服务器上的新数据。如果有一些新数据可用,我需要将其添加到ArrayList中,前提是该ArrayList中尚未存在该数据 通过阅读与此类似的其他问题,我了解到我需要通过重写模型中的.equals和.hashcode在ArrayList上使用.contains 因此,我的模型如下所示: class Order { String tavolo; String ora; @Override public int hashCode

每x秒,我在Android应用程序中检查服务器上的新数据。如果有一些新数据可用,我需要将其添加到ArrayList中,前提是该ArrayList中尚未存在该数据

通过阅读与此类似的其他问题,我了解到我需要通过重写模型中的.equals和.hashcode在ArrayList上使用.contains

因此,我的模型如下所示:

class Order {
    String tavolo;
    String ora;

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

    Order(String tavolo, String ora){
        this.tavolo = tavolo;
        this.ora = ora;
    }

    public String getOra() {
        return ora;
    }

    public String getTavolo() {
        return tavolo;
    }

    public void setOra(String ora) {
        this.ora = ora;
    }

    public void setTavolo(String tavolo) {
        this.tavolo = tavolo;
    }
}
public ArrayList<Order> ordini;
public void VisualOrder(){
    Ion.with(getApplicationContext())
            .load("GET", "https://visualorder.it/api/ordine/13/00168780351/")
            .asJsonArray()
            .setCallback(new FutureCallback<JsonArray>() {
                @Override
                public void onCompleted(Exception e, JsonArray result) {
                    if(result != null && result.size() > 0){
                        badgeOrders.setNumber(result.size());
                        result.forEach(ordine -> {
                            Order order = new Order(ordine.getAsJsonObject().get("tavolo").toString(), ordine.getAsJsonObject().get("dataora").toString());
                            if(!ordini.contains(order)){ // Check if order is yet in ArrayList
                                ordini.add(order); // if not add to ArrayList
                                adapterOrdini.notifyDataSetChanged();
                            }
                        });
                    }
                }
            });
}
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Order order = (Order) o;
    return Objects.equals(tavolo, order.tavolo) &&
            Objects.equals(ora, order.ora);
}

@Override
public int hashCode() {
    return Objects.hash(tavolo, ora);
}
我检查ArrayList中是否存在该项的方法如下所示:

class Order {
    String tavolo;
    String ora;

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

    Order(String tavolo, String ora){
        this.tavolo = tavolo;
        this.ora = ora;
    }

    public String getOra() {
        return ora;
    }

    public String getTavolo() {
        return tavolo;
    }

    public void setOra(String ora) {
        this.ora = ora;
    }

    public void setTavolo(String tavolo) {
        this.tavolo = tavolo;
    }
}
public ArrayList<Order> ordini;
public void VisualOrder(){
    Ion.with(getApplicationContext())
            .load("GET", "https://visualorder.it/api/ordine/13/00168780351/")
            .asJsonArray()
            .setCallback(new FutureCallback<JsonArray>() {
                @Override
                public void onCompleted(Exception e, JsonArray result) {
                    if(result != null && result.size() > 0){
                        badgeOrders.setNumber(result.size());
                        result.forEach(ordine -> {
                            Order order = new Order(ordine.getAsJsonObject().get("tavolo").toString(), ordine.getAsJsonObject().get("dataora").toString());
                            if(!ordini.contains(order)){ // Check if order is yet in ArrayList
                                ordini.add(order); // if not add to ArrayList
                                adapterOrdini.notifyDataSetChanged();
                            }
                        });
                    }
                }
            });
}
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Order order = (Order) o;
    return Objects.equals(tavolo, order.tavolo) &&
            Objects.equals(ora, order.ora);
}

@Override
public int hashCode() {
    return Objects.hash(tavolo, ora);
}
但是!ordini.containsorder每次都返回true,即使我正在添加ArrayList中已经存在的项

因此,只有当项目不在该列表中时,我如何将该项目添加到ArrayList中?

您需要重写equals和hashcode方法,如下所示:

class Order {
    String tavolo;
    String ora;

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

    Order(String tavolo, String ora){
        this.tavolo = tavolo;
        this.ora = ora;
    }

    public String getOra() {
        return ora;
    }

    public String getTavolo() {
        return tavolo;
    }

    public void setOra(String ora) {
        this.ora = ora;
    }

    public void setTavolo(String tavolo) {
        this.tavolo = tavolo;
    }
}
public ArrayList<Order> ordini;
public void VisualOrder(){
    Ion.with(getApplicationContext())
            .load("GET", "https://visualorder.it/api/ordine/13/00168780351/")
            .asJsonArray()
            .setCallback(new FutureCallback<JsonArray>() {
                @Override
                public void onCompleted(Exception e, JsonArray result) {
                    if(result != null && result.size() > 0){
                        badgeOrders.setNumber(result.size());
                        result.forEach(ordine -> {
                            Order order = new Order(ordine.getAsJsonObject().get("tavolo").toString(), ordine.getAsJsonObject().get("dataora").toString());
                            if(!ordini.contains(order)){ // Check if order is yet in ArrayList
                                ordini.add(order); // if not add to ArrayList
                                adapterOrdini.notifyDataSetChanged();
                            }
                        });
                    }
                }
            });
}
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Order order = (Order) o;
    return Objects.equals(tavolo, order.tavolo) &&
            Objects.equals(ora, order.ora);
}

@Override
public int hashCode() {
    return Objects.hash(tavolo, ora);
}

这不是您覆盖equals的方式。您的实现将检查它们是否是完全相同的对象。你需要检查它们是否相等,例如,检查它们的所有属性是否相等。您应该使用一些IDE,它可以为您生成足够好的实现,比如Intellij。通过重写.equals和.hashcode,重写这些方法的目的是改变它们的行为,而不仅仅是让它们做它们已经做过的事情。哦,要补充我之前的评论,您还需要一个适当的hashcode实现,不只是平等。伊戈尔说的。如果我们提供了.equals和.hashCode的实现,我们可以使用.contains来检查项是否存在,否则对象引用将用于相等比较,并且您的实现也在检查引用,所以请更改该选项。同样在列表的情况下,.contains是在操作中的,因为HashSet是O1,所以最好使用后者。您还需要重写hashcode,否则可能会发生奇怪的事情。