Java 检查ArrayList中是否存在对象
每x秒,我在Android应用程序中检查服务器上的新数据。如果有一些新数据可用,我需要将其添加到ArrayList中,前提是该ArrayList中尚未存在该数据 通过阅读与此类似的其他问题,我了解到我需要通过重写模型中的.equals和.hashcode在ArrayList上使用.contains 因此,我的模型如下所示: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
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,否则可能会发生奇怪的事情。