No se pueden eliminar elementos duplicados de arraylist de hashmap
Estoy buscando los contactos del proveedor de contenido y tengo que mostrarlos en un listview.In el proceso de buscar con éxito los contactos, pero contienen valores duplicados . Ahora Phone.CONTACT_ID es único para cada contacto. Quiero filtrar mi arraylist de contactos Basado en ese campo particular.
Aquí está el código:
- Cordova-plugin-contacts bloquea la aplicación
- Android cómo enviar múltiples contactos se adjuntan en un archivo .vcf simple y enviar a correo?
- ContactsContract para enumerar todos los campos disponibles?
- Obtener el nombre y el correo electrónico de la lista de contactos es muy lento
- Aplicación de copia de seguridad y sincronización de contactos
try { cursor = getApplicationContext().getContentResolver() .query(Phone.CONTENT_URI, null, null, null, null); int Idx = cursor.getColumnIndex(Phone.CONTACT_ID); int nameIdx = cursor.getColumnIndex(Phone.DISPLAY_NAME); int phoneNumberIdx = cursor.getColumnIndex(Phone.NUMBER); int photoIdIdx = cursor.getColumnIndex(Phone.PHOTO_THUMBNAIL_URI); cursor.moveToFirst(); do { System.out.println("=====>in while"); HashMap<String, String> hashMap = new HashMap<String, String>(); contactid=cursor.getString(Idx); name = cursor.getString(nameIdx); phoneNumber = cursor.getString(phoneNumberIdx); image = cursor.getString(photoIdIdx); System.out.println("Id--->"+contactid+"Name--->"+name); if (!phoneNumber.contains("*")) { hashMap.put("contactid", "" + contactid); hashMap.put("name", "" + name); hashMap.put("phoneNumber", "" + phoneNumber); hashMap.put("image", "" + image); // hashMap.put("email", ""+email); hashMapsArrayList.add(hashMap); } } while (cursor.moveToNext()); } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } }
Aquí puedes ver que estoy buscando 4 campos desde el cursor y enlazándolos con el arraylist hashMapsArrayList
que es ArrayList<HashMap<String, String>> hashMapsArrayList=new ArrayList<HashMap<String,String>>();
. Ahora este arraylist contiene campos duplicados y quiero filtrarlo basado en el contactid .
Aquí está el código:
System.out.println("Original--->"+hashMapsArrayList); for(int i=0;i<hashMapsArrayList.size();i++) { HashMap<String, String> resultp = new HashMap<String, String>(); resultp = hashMapsArrayList.get(i); String contactiddup=resultp.get("contactid"); if(!( hashMapsArrayListRemovedup.contains(contactiddup))) { System.out.println(hashMapsArrayListRemovedup); System.out.println("In if added"); hashMapsArrayListRemovedup.add(resultp); }else{ System.out.println("In else"); } }
Pero el código anterior no funciona y el nuevo arraylist también contiene valores duplicados.
Por favor ayuda.
Una duplicidad de salida de ejemplo:
12-15 14:10:57.217: I/System.out(8971): [{name=Didi America, image=null, phoneNumber=, contactid=7996}, {name=Didi America, image=null, phoneNumber=, contactid=7996}]
- Contactos de Android ¿Nombre de visualización y número (s) de teléfono en una consulta de base de datos única?
- Obtener contactos en android es muy lento
- ¿Cómo puedo configurar un tono para un contacto individual en Android?
- Configurar el tono de llamada personalizado de contacto, ¿cómo?
- Acceder a los filtros de contactos
- Android: consulta ContactsContract, necesita más cadena de selección avanzada
- Agregue RawContact para agregarlo a un contacto existente
- Insertar contactos Apellido utilizando Intent android
Puede, y debe quitar los duplicados cuando construye la lista, en el bucle while. Simplemente use un HashSet
para recopilar los identificadores únicos, y sólo agregue entradas que tengan un nuevo identificador en la lista:
Set<String> ids = new HashSet<>(); do { System.out.println("=====>in while"); contactid=cursor.getString(Idx); if (!ids.contains(contactid)) { ids.add(contactid); HashMap<String, String> hashMap = new HashMap<String, String>(); name = cursor.getString(nameIdx); phoneNumber = cursor.getString(phoneNumberIdx); image = cursor.getString(photoIdIdx); System.out.println("Id--->"+contactid+"Name--->"+name); if (!phoneNumber.contains("*")) { hashMap.put("contactid", "" + contactid); hashMap.put("name", "" + name); hashMap.put("phoneNumber", "" + phoneNumber); hashMap.put("image", "" + image); // hashMap.put("email", ""+email); hashMapsArrayList.add(hashMap); } } } while (cursor.moveToNext());
No necesita el segundo fragmento de código (no revisé para ver qué hay de malo en él).
Utilice HashSet
para eliminar entradas duplicadas.
P.ej.
public static HashSet<String> hSet= new HashSet<String>();
Agregue valor a HasSet usando hSet.add(yourString);
Para obtener el valor de HashSet
tienes que usar Iterator
Iterator iterator = hSet.iterator(); while(iterator.hasNext()){ String str = iterator.next(); }
Alternativamente, puede comprobar la frecuencia como eliminar también. Refiérase a este código.puede ayudarle.
Collections.frequency(arrayList, number) public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(5); arrayList.add(1); arrayList.add(5); arrayList.add(1); arrayList.add(5); arrayList.add(2); arrayList.add(3); ArrayList<Integer> unique = new ArrayList<>(); for (Integer number : arrayList) { if (Collections.frequency(arrayList, number) == 1) { unique.add(number); } } System.out.println(unique); }
- Robospice solicitud nunca termina si la aplicación va en el fondo y luego llega a primer plano?
- Ingresar usando Google+ en Parse