Android:如果该列表中不存在该对象的某个字段,则将对象添加到列表中

时间:2018-05-02 16:53:18

标签: android

我有一个名为items的对象,使用此类:

      public class Items(){

       String item_id;
       String item_name

       public Items(){}

       public Items(String item_id , String item_name){

        this.item_id = item_id;
        this.item_name = item_name;


        }

        public String getItem_id(){

         return item_id;
        }

        public void setItem_id(){

         this.item_id = item_id;
        }

        public String getItem_name(){
         return item_name;
        }

        public void setItem_name(){

         this.item_name = item_name;  
        }


      }

现在我想将此对象添加到List,但我希望仅在(列表中没有其他具有相同item_id的对象时)才添加该对象。

有些事情是这样的:

     List<Items> item_list = new ArrayList():

     Items item = new Items();
     item.setItem_id("item_0001");


      if(/*list doesn't have an object with this id*/){

       item_list.add(item);
      }

我想实现这一点,而不需要在每次添加新项目时循环遍历列表。

感谢。

3 个答案:

答案 0 :(得分:0)

你最好使用其他数据结构,例如HashTable。没有循环(显式或隐式)通过它搜索List是没有办法的。

Map<String, Items> map = new HashMap<>();

 Items item = new Items();
 item.setItem_id("item_0001");

  if(!map.containsKey(items.getItem_id())){
      map.put(item.getItem_id(), item);
  }

之后你可以简单地从地图中获取值:

List<Items> list = new ArrayList<Items>(map.values());

答案 1 :(得分:0)

您可以使用等于方法。让我举个例子。 For e.g.在我的情况下,我有ProductListDataResponse课程。您只需要关注此课程中的等于方法,并根据您的班级更改您的代码。

例如。

 @Override
    public boolean equals(Object obj) {
        if (obj instanceof ProductListDataResponse) {
            ProductListDataResponse productListDataResponse = (ProductListDataResponse) obj;
            return productId.equals(productListDataResponse.getProductId());
        } else return false;
    }

我的ProductListDataResponse类:

public class ProductListDataResponse implements Serializable {

    @SerializedName("thumbnail_image")
    @Expose
    private String thumbnailImage;
    @SerializedName("actual_image")
    @Expose
    private String actualImage;
    @SerializedName("product_id")
    @Expose
    private String productId;
    @SerializedName("product_name")
    @Expose
    private String productName;
    @SerializedName("product_description")
    @Expose
    private String productDescription;
    @SerializedName("product_cost")
    @Expose
    private String productCost;
    @SerializedName("category_id")
    @Expose
    private String categoryId;
    @SerializedName("product_code")
    @Expose
    private String productCode;

    public ProductListDataResponse(String productId) {
        this.productId = productId;
    }

    public ProductListDataResponse(String thumbnailImage, String actualImage, String productId, String productName,
                                   String productDescription, String productCost, String categoryId, String productCode) {
        this.thumbnailImage = thumbnailImage;
        this.actualImage = actualImage;
        this.productId = productId;
        this.productName = productName;
        this.productDescription = productDescription;
        this.productCost = productCost;
        this.categoryId = categoryId;
        this.productCode = productCode;
    }

    public String getThumbnailImage() {
        return thumbnailImage;
    }

    public void setThumbnailImage(String thumbnailImage) {
        this.thumbnailImage = thumbnailImage;
    }

    public String getActualImage() {
        return actualImage;
    }

    public void setActualImage(String actualImage) {
        this.actualImage = actualImage;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getProductDescription() {
        return productDescription;
    }

    public void setProductDescription(String productDescription) {
        this.productDescription = productDescription;
    }

    public String getProductCost() {
        return productCost;
    }

    public void setProductCost(String productCost) {
        this.productCost = productCost;
    }

    public String getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(String categoryId) {
        this.categoryId = categoryId;
    }

    public String getProductCode() {
        return productCode;
    }

    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof ProductListDataResponse) {
            ProductListDataResponse productListDataResponse = (ProductListDataResponse) obj;
            return productId.equals(productListDataResponse.getProductId());
        } else return false;
    }
}

现在转到您要添加对象的班级。创建实例并传递id。如果Id存在,它将返回位置,否则它将返回-1。当值为-1时,表示值不存在,请立即保存。

 for (int myCartIndex = 0; myCartIndex < myCartList.size(); myCartIndex++) {

                        MyCart myCart = myCartList.get(myCartIndex);
                        String productIdMyCart = myCart.getProductId();
                        ProductListDataResponse productListData = new ProductListDataResponse(productIdMyCart);
                        int index = productListDataResponseList.indexOf(productListData);

                        if (index == -1) {
                            //Add here your object.
                        }
}

答案 2 :(得分:0)

基本上,如果你想使用类似数组的数据结构,没有其他方法可以在没有循环的情况下执行此操作。甚至像List.contains()这样的类方法也使用迭代。您可以像其他答案建议的那样使用地图。或者,如果您不想修改现有数据结构,则可以使用Set。

List<Items> item_list = new ArrayList():
Set<String> item_set = new HashSet();

Items item = new Items();
item.setItem_id("item_0001");


 if(!item_set.contains(item.getItem_id()))
 {
   item_list.add(item);
   item_set.add(item.getItem_id())
 }