2011-10-26 11 views
10

Ho appena creato un ricevitore di trasmissione con il quale posso ricevere i messaggi di testo in arrivo, piuttosto che dividere il messaggio di testo quando c'è uno spazio e salvarlo in un String[].Verificare se String in String [] è in ArrayList <string>

Ora ho bisogno di controllare se in questo String[] è qualcosa dalla mia base di dati. Per questo ho creato un ArrayList<String>, che ottiene tutte le voci dalla colonna corrispondente. Ora ho bisogno di controllare se una stringa nel mio ArrayList è lo stesso nel mio String[] dal messaggio di testo, ma non so come realizzare questo.

C'è un modo semplice e veloce per controllare che, anche ho bisogno di sapere quale stringa è in ciascuno di essi?

SmileySmsReceiver:

package de.retowaelchli.filterit.services; 


    import java.util.ArrayList; 

    import de.retowaelchli.filterit.database.SFilterDBAdapter; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.database.Cursor; 
    import android.os.Bundle; 
    import android.telephony.SmsMessage; 
    import android.util.Log; 
    import android.widget.Toast; 



    public class SmileySmsReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      //Datenbank definieren 
      SFilterDBAdapter mDbHelper = new SFilterDBAdapter(context); 


      //---get the SMS message passed in--- 
      Log.d("SmileySmsReceiver", "Yes it calls the onReceive"); 
      Bundle bundle = intent.getExtras();   
      SmsMessage[] msgs = null; 
      String str = "";    
      if (bundle != null) 
      { 
       Log.d("SmileySmsReceiver", "Bundle is not null"); 
       //---retrieve the SMS message received--- 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       msgs = new SmsMessage[pdus.length];    
       for (int i=0; i<msgs.length; i++){ 
        msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);     
        str += "SMS from " + msgs[i].getOriginatingAddress();      
        str += " :"; 
        str += msgs[i].getMessageBody().toString(); 
        str += "\n";   
       Log.d("SmileySmsReceiver","Was steht in der Nachricht?: " + str); 

       String[] splited = str.split("\\s+"); 

       //Hier werden die Strings der Smileys aus der Datenbank gezogen 
       mDbHelper.open(); 
       Cursor c = mDbHelper.getAllSFilter(); 

       ArrayList<String> SmileyList = new ArrayList<String>(); 
       c.getColumnIndex(SFilterDBAdapter.KEYWORD); 
       int ColumnIndex = c.getColumnIndex(SFilterDBAdapter.KEYWORD); 
        if(c!=null) 
         { 
         //Hier werden die Smileys in die ArrayList geschrieben 
         while(c.moveToNext()){ 
          String infoItem = c.getString(ColumnIndex); 
          SmileyList.add(infoItem); 
         } 
<------------------------- FROM HERE ON I NEED YOUR GUYS HELP -------------------------------> 
       } 
       } 
       //---display the new SMS message--- 
       Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
      }       
     } 
    } 
+0

possiamo assegnare valori direttamente A LISTA da funzione split ?? – Jithu

risposta

15

Se si dispone di un String myString e un ArrayList<String> myListOfStrings, è possibile controllare se myString è nella lista come questa:

myListOfStrings.contains(myString); 

Ciò restituirà un valore booleano (true/false) - true se è stato trovato le corde, falso se non.

Nel tuo caso si vorrebbe correre attraverso l'array di stringhe e abbinare ciascuno di essi al SmileyList in questo modo:

for(String s : splitted) { 
    if(SmileyList.contains(s)) { 
    //Do what you need to do if the string is in the SmileyList. 
    } 
} 
+0

thx per te awnser, ma come ho scoperto ora, quale String era in entrambi? – safari

+0

Se 'se (SmileyList.contains (s))' restituisce 'true', la stringa che era in entrambi è uguale a' s'. – kaspermoerch

+0

sì, ma ho bisogno di sapere quale stringa era. – safari

2

È possibile iterare l'array (ad esempio con un ciclo for sopra splitted.length), interrogando la vostra lista con myList.contains(splitted[i]). La query restituirà un boolean.

Se avete bisogno di controllare se sono presenti nella lista tutti elementi dell'array, v'è una comoda alternativa con myList.containsAll(Arrays.asList(splitted))

C'è un'altra alternativa conciso, senza loop per verificare se qualsiasi oggetto della array è presente nella lista:

List splitList = Arrays.asList(splitted); 
splitList.retainAll(myList); 

splitList.isEmpty() tornerà false, se qualsiasi elemento delle liste è corrispondenza.

Il contenuto del splitList mostreranno tutte le stringhe che sono abbinate.

+0

Potrebbe essere positivo aggiungere una condizione di uscita al ciclo per l'efficienza. L'OP vuole solo sapere se almeno un elemento è contenuto nella lista. –

+0

sicuramente, sarebbe positivo interrompere il ciclo una volta che hai la risposta - ho semplicemente considerato il flusso di controllo al di fuori della portata della domanda – kostja

3
String array[] = ... ; 
List<String> list = ... ; 
// check if anything in array is in list 
for(String str : array) 
    if(list.contains(str)) doSomething() ; 

Se si vuole fare qualcosa per ogni partita, il codice di cui sopra funzionerà. Se si desidera solo fare qualcosa una volta, se c'era una partita (e non per ogni partita), è necessario aggiungere una dichiarazione break nel caso frase.

1

A seconda dell'ampiezza dell'array e dell'arraylist e del numero di accessi che è possibile accedere, è possibile utilizzare un hashset anziché un arraylist in modo da ottenere una rapida ricerca con il metodo con hash invece di per scorrere la lista di array. Qualcosa di simile a questo:

boolean containsString(ArrayList<String> stringArrayList, String[] stringArray) { 
    Set<String> stringSet = new HashSet<String>(stringArrayList); // if same input is used reused, might want this outside the method 

    for (String s : stringArray) { 
     if (stringSet.contains(s)) { 
      return true; 
     } 
    } 

    return false; 
} 
Problemi correlati