2015-12-15 9 views
5

ich Kontakte von Content-Provider bin zu holen und ich brauche sie in einem listview.In den Prozess zum Anzeigen ich die Kontakte erfolgreich holen, aber sie enthält doppelte Werte .Jetzt Phone.CONTACT_ID ist einzigartig für jeden Kontakt. Ich möchte meine Arraylist von Kontakten basierend auf diesem bestimmten Feld filtern. HierKann doppelte Elemente aus Arraylist von hashmap entfernen

ist der Code:

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(); 
      } 
     } 

Hier können Sie sehen, dass ich das Abrufen 4 Felder aus dem Cursor und Binden sie in die Arraylist hashMapsArrayList die ArrayList<HashMap<String, String>> hashMapsArrayList=new ArrayList<HashMap<String,String>>(); ist .Jetzt diese Arraylist doppelte Felder enthält, und ich möchte Filter es auf der Grundlage der contactid. Hier

ist der Code:

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"); 
     } 

    } 

Aber der obige Code funktioniert nicht und die neue Arraylist enthält auch doppelte Werte.

Bitte helfen.

Eine Beispielausgabe duplicacy:

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}] 
+0

Arraylist-Elemente In der LinkedHashSet zu verwenden, um haben die doppelten Elemente entfernen – Sree

+0

http://stackoverflow.com/questions/203984/how-do-i-remove-repeated-elements-from-arraylist – Sunny

+0

Welche doppelten Werte meinst du? Es gibt keine doppelten Daten im Anbieter – pskink

Antwort

3

Sie können und sollten die Duplikate entfernen, wenn Sie die Liste konstruieren, in der while-Schleife. Verwenden Sie einfach ein HashSet die eindeutigen IDs zu sammeln, und nur Einträge hinzufügen, die neu Kennung zur Liste:

 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()); 

Sie nicht die zweiten Code-Schnipsel müssen (ich nicht überprüfen, um zu sehen, was drin ist falsch).

+0

Lassen Sie mich versuchen ...... – kgandroid

+0

Die Logik des obigen Codes ist ausgezeichnet und es funktioniert – kgandroid

+0

Aus der Kürze können Sie bitte einen Blick auf das 2. Code-Snippet und sag mir, was ich falsch gemacht habe ?? – kgandroid

0

Alternativ können Sie auch die Frequenz als Entfernen überprüfen. verweisen Sie diesen Code.Er kann Ihnen helfen.

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); 
} 
+0

Dies wird den Zweck nicht lösen – kgandroid

1

Verwenden Sie HashSet, um doppelte Einträge zu entfernen.

Eg.

public static HashSet<String> hSet= new HashSet<String>(); 

erhöhen den Wert Hasset mit hSet.add(yourString);

Für get Wert von HashSet Sie Iterator

Iterator iterator = hSet.iterator(); 
while(iterator.hasNext()){ 
     String str = iterator.next(); 
} 
+0

Ich habe versucht, Hashset .. Aber es hat nicht funktioniert .. – kgandroid