Удалить дубликаты из двух ArrayList типа ArrayList<Каталог> Android
Деятельность MyListView.java содержит два массива: catalogueArrayList и catalogTempArrayList соответственно.
ArrayList<Catalogue> catalogueArrayList = new ArrayList<Catalogue>();
ArrayList<Catalog> catalogTempArrayList = new ArrayList<Catalog>();
В действии onCreate() просмотр списка заполняется с помощью catalogueArrayList. При обновлении новые данные переносятся во второй массив arrayList в фоновом режиме, а затем добавляются в каталог ArrayList. Я не хочу очищать свой адаптер перед обновлением списка. Одна идея состоит в том, чтобы удалить дубликаты элементов и использовать временный массив для отображения новых данных. Моя проблема в том, что я не знаю, как сравнить два архива, найти дубликаты, удалить их и создать третий массив. Будет ли это решение эффективным? Будет ли это потреблять раз?
Вот мой каталог по классу.
public class Catalogue {
public String client_tel;
public String product_name;
public String product_price;
public String product_desc;
public String product_img;
public Catalogue(String _client_tel, String _product_name,String _product_price,String _product_desc,String _product_img){
this.client_tel=_client_tel;
this.product_name=_product_name;
this.product_price=_product_price;
this.product_desc=_product_desc;
this.product_img=_product_img;
}
Класс каталога является просто дубликатом этого класса.
== Обновление ==
Вот моя задача обновления
list.setOnUpdateTask(new OnUpdateTask() {
public void updateBackground() {
// simulate long times operation.
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void updateUI() {
catalogueArrayList.removeAll(catalogTempArrayList);
efficientAdapter.notifyDataSetChanged();
}
public void onUpdateStart() {
new loadDataAsync().execute();
}
});
и мой эффективный конструктор адаптеров
public EfficientAdapter(Activity a, ArrayList<Catalog> d) {
activity = a;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// imageLoader = new ImageLoader(activity.getApplicationContext());
//imageLoader=new ImageLoader(activity.getApplicationContext());
imageLoader = ImageLoader.getInstance();
}
2 ответа
Есть несколько способов сделать это.
Во-первых, вы должны определить equals
функция в вашем Catalogue
а также Catalog
классы. Проверьте, является ли объект каталогом или классом каталога, затем сравните.
public boolean equals(Object o){
if (o == null){
return false;
}
if (o instanceof Catalog){
Catalog c = (Catalog) o;
return c.product_name.equals(this.product_name)
}
if (o instanceof Catalogue){
Catalogue cg = (Catalogue) o;
return cg.product_name.equals(this.product_name)
}
return false;
}
Тогда вы могли бы использовать Iterator<Catalogue>
проверить, есть ли в catalogTempArrayList
и удалите его из catalogueArrayList
, Или просто используйте removeAll
функция от ArrayList
,
catalogueArrayList.removeAll(catalogTempArrayList);
Если вы хотите удалить Catalog
экземпляр из catalogTempArrayList
, Используйте это вместо:
catalogTempArrayList.removeAll(catalogueArrayList);
Эти функции стоят O (n * m), так как n и m количество элементов массивов.
Попробуйте использовать
catalogueArrayList.removeAll(catalogTempArrayList);
Это удалит все Catalogue
предметы, которые два ArrayList
имеют общее с catalogueArrayList
,
Примечание: не будет никаких изменений в catalogTempArrayList
, У него все еще будут все предметы.
Вы должны переопределить equals
а также hashcode
метод в вашем Catalogue
учебный класс.