0

I noticed that i return duplicate rows in my listview constructed from my arrayList. I would like to check if the elements exist in the arraylist and if so, ignore that set. The unique value to check would be my id, denoted by KEY_SID.

Here's my code:

 public ArrayList<SaleModel> loadSalesFromSQLite() {
        ArrayList<SaleModel> sales = new ArrayList<>();
        hp = new HashMap();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = db.rawQuery("SELECT  * FROM " + TABLE_SALES + " ORDER BY datetime(created_at) DESC", null);
        res.moveToFirst();
        while (!res.isAfterLast()) {
            SaleModel l_sales = new SaleModel();

            l_sales.setId(res.getString(res
                    .getColumnIndex(KEY_SID)));
            l_sales.setCode(res.getString(res
                    .getColumnIndex(KEY_CODE)));
            l_sales.setAttendant_id(res.getString(res
                    .getColumnIndex(KEY_ATTENDANT_ID)));
            l_sales.setAttendant_name(res.getString(res
                    .getColumnIndex(KEY_ATTENDANT_NAME)));
            l_sales.setProduct_id(res.getString(res
                    .getColumnIndex(KEY_PRODUCT_ID)));
            l_sales.setPrice(res.getString(res
                    .getColumnIndex(KEY_PRICE)));
            l_sales.setCustomer_id(res.getString(res
                    .getColumnIndex(KEY_CUSTOMER_ID)));
            l_sales.setCustomer_first_name(res.getString(res
                    .getColumnIndex(KEY_CUSTOMER_FIRST_NAME)));
            l_sales.setCustomer_last_name(res.getString(res
                    .getColumnIndex(KEY_CUSTOMER_LAST_NAME)));
            l_sales.setCustomer_image(res.getString(res
                    .getColumnIndex(KEY_CUSTOMER_IMAGE)));
            l_sales.setUid(res.getString(res
                    .getColumnIndex(KEY_UID)));
            l_sales.setQuantity(res.getString(res
                    .getColumnIndex(KEY_QUANTITY)));
            l_sales.setP_name(res.getString(res
                    .getColumnIndex(KEY_PRODUCT_NAME)));
            l_sales.setP_image(res.getString(res
                    .getColumnIndex(KEY_PRODUCT_IMAGE)));
            l_sales.setCreated_at(res.getString(res
                    .getColumnIndex(KEY_PRODUCT_CREATED)));
            l_sales.setSvg(res.getString(res
                    .getColumnIndex(KEY_SVG)));
            l_sales.setOfflineTag(res.getString(res
                    .getColumnIndex(KEY_OFFLINETAG)));

            sales.add(l_sales);
            res.moveToNext();
        }
        Log.d(TAG, "Fetching sales from Sqlite: ");
        res.close();
        return sales;
    }

Before i return sales arrayList, i would like to check for duplicates there, remove them, the return the arrayList without duplicates. Any suggestions?

Steve Kamau
  • 2,755
  • 10
  • 42
  • 73

2 Answers2

0

You could do a couple of things:

  1. Use DISTINCT or GROUP BY in your SQL to remove duplicates coming back from the database
  2. Add the elements to a Set instead of an ArrayList (but you would need to ensure your SaleModel class implments hashCode() and equals()
rohitvats
  • 1,811
  • 13
  • 11
0

With Lambda Expression

List<Object> newList = listWithDuplicates.stream()
                          .distinct().collect(Collectors.toList());
Durgpal Singh
  • 11,481
  • 4
  • 37
  • 49