2015-12-16 27 views
5

Ho iniziato di recente la programmazione in Android e Java in generale, quindi per favore portami con me.Il ciclo non cattura i duplicati e li rimuove in Android (Java)

Ho scritto un ciclo che dovrebbe, prima di aggiungere un nuovo nome e numero di telefono a un elenco e un array nascosto, rimuovere eventuali duplicati trovati in precedenza. Usando i metodi attuali ho ancora ripetizioni costanti, e quando clicco sul pulsante per aggiungere di nuovo tutti gli stessi contatti, ottengo di nuovo tutti i contatti. Questo mi fa pensare il metodo di controllo duplicato non funziona correttamente a tutti, ma Im non ottenere alcun erori per aiutare

Ho due array lista che ho creato al di fuori:

List<String> phnnumbers = new ArrayList<String>(); 
List<String> names = new ArrayList<String>(); 

Questo è i contatti Aggiunta metodo:

public void AddAllContacts(View view) { 
    try { 
     Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 

     while (phones.moveToNext()) { 
      String linesp = System.getProperty("line.separator"); 
      TextView quantityTextView = (TextView) findViewById(R.id.numbersview); 
      String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      duplicatecheck(name, phoneNumber); 
      addthistothelist(name, phoneNumber); 
     } 
     phones.close(); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

Questo è il metodo di controllo duplicato:

public void duplicatecheck(String name,String phoneNumber) { 
    for (int i=0;i<phnnumbers.size();i++) { 
     String thenumber = phnnumbers.get(i); 
     String thename= names.get(i); 
    if(thenumber.equals(phoneNumber)) { 
      phnnumbers.remove(i); 
      names.remove(i); 
     TextView quantityTextView = (TextView) findViewById(R.id.numbersview); 
     String textpost = quantityTextView.getText().toString(); 
     String newtextpost = textpost.replaceAll(thenumber, "UNBELIEVABLEEE"); 
     String secondtextpost = newtextpost.replaceAll(thename, "UNBELIEVABLE"); 
     quantityTextView.setText(secondtextpost); 
     NumberOfContactsAdded--; 
     } 
    } 
} 

Questo è il metodo che viene chiamato dopo che dovrebbe controllare i duplicati e rimuovere, questa metodo successivo è quello di aggiungere il numero e il nome successivo:

public void addthistothelist(String nameofperson,String NumberOfPerson) { 

    String linesp = System.getProperty("line.separator"); 
    TextView quantityTextView = (TextView) findViewById(R.id.numbersview); 
    String textpost = quantityTextView.getText().toString(); 
    NumberOfPerson = NumberOfPerson.replaceAll("[^0-9]", ""); 
    if(NumberOfPerson.contains("+1")) { 
     phnnumbers.add(NumberOfPerson); 
     names.add(nameofperson); 
     NumberOfContactsAdded++; 
     quantityTextView.append(linesp+nameofperson+" " +NumberOfPerson); 
    } else { 
     NumberOfPerson= "+1"+NumberOfPerson; 
     phnnumbers.add(NumberOfPerson); 
     names.add(nameofperson); 
     NumberOfContactsAdded++; 
     quantityTextView.append(linesp+nameofperson+" " +NumberOfPerson); 
    } 
} 

Im davvero perso su quello che ho potuto fare male. Vorrei provare a ripulire questo codice ma non funziona nemmeno correttamente per me per pulirlo.

risposta

3

Semplicemente si può fare in questo modo:

  1. Creare una classe bean per persona

    public class Person { private String name; telefono String privato;

    public Person(String name, String phone) { 
        this.name = name; 
        phone = phone.replaceAll("\\W+", ""); 
        phone = "+1"+phone; 
        this.phone = phone; 
    } 
    
    @Override 
    public boolean equals(Object o) { 
        if (this == o) 
         return true; 
        if (o == null || getClass() != o.getClass()) 
         return false; 
        Person person = (Person) o; 
        return name != null ? name.equals(person.name) : person.name == null && (phone != null ? phone.equals(person.phone) : person.phone == null); 
    
    } 
    
    @Override 
    public int hashCode() { 
        int result = name != null ? name.hashCode() : 0; 
        result = 31 * result + (phone != null ? phone.hashCode() : 0); 
        return result; 
    } 
    

    }

  2. Poi iterare tutti i contatti e metterli in un insieme, che verrà automaticamente evitare dulicates

    Set<Person> persons = new HashSet<>(); 
    
    public void AddAllContacts(View view) { 
        try { 
         Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 
    
        while (phones.moveToNext()) { 
         String linesp = System.getProperty("line.separator"); 
         TextView quantityTextView = (TextView) findViewById(R.id.numbersview); 
         String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
         String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         Person person = new Person(name, phoneNumber); 
         persons.add(person); 
        } 
        phones.close(); 
    

    // qui quello che vuole si può fare con il Set di persona } catch (Eccezione e) { e.printStackTrace(); }}

+0

Okay che ha senso. Come potrei prendere il nome e il numero di telefono di ciascuna persona in una stringa diversa? Sto cercando di farli scorrere tra loro in base alle dimensioni di Hashset. Dal momento che userò un comando che ha bisogno del loro nome e numero separati. Non posso usare person.name o person.phoneNumber in un altro metodo –

+0

Una volta ottenuto il set di persone, allora iterate questo insieme, ottenete ogni oggetto Person e poi assegnate questo oggetto Person a un altro metodo. –

+0

Mi dispiace Non sono sicuro di come lo farei? 'Iterator it = hset.iterator(); while (it.hasNext()) { System.out.println (it.next()); } Questo è il modo per iterare, ma come potrei darlo a un altro metodo o cambiarlo in un tipo diverso? –

0

Non ho esperienza di programmazione con Android, ma una cosa che posso vedere è che si stanno rimuovendo elementi da phnumbers mentre si sta iterando tramite phnumbers, non si dovrebbe fare questo. Utilizzare un iteratore o aggiungere gli indici elementi/elementi a un elenco e rimuoverli da nnumeri dopo aver eseguito iterazioni su nnumeri.

+0

Penso che il mio problema non ha molto a che fare con Android, solo per sé Java. Quindi potrei risolverlo inserendo una nuova variabile uguale alla dimensione di phnumber prima di iniziare a usarla e usarla piuttosto che la sua .size() o non funzionerebbe? –

+0

È scorretto rimuovere le variabili mentre si scorre su una raccolta, con il comando for (int i .... Approccio noto agli arraylists che salterete un elemento dopo averlo rimosso.L'oggetto nell'indice i sarà un nuovo oggetto dopo aver chiamato remove (i), ma poi continuerai con il ciclo e questo nuovo elemento verrà saltato. Per altre raccolte il comportamento varierà, quindi per riferimento futuro sarebbe meglio usare il metodo di rimozione di un iteratore, o "ricordare" gli indici/oggetti da rimuovere e rimuoverli dopo aver terminato l'iterazione – nullwarrior