2011-10-26 15 views
10

Acabo de crear un Broadcast Receiver con el que puedo obtener los mensajes de texto entrantes, que dividir el mensaje de texto cuando hay un espacio y guardarlo en String[].Compruebe si String in String [] está en ArrayList <string>

Ahora necesito comprobar si en este String[] es algo de mi base de datos. Para eso creé un ArrayList<String>, que obtiene todas las entradas de la columna correspondiente. Ahora necesito verificar si una cadena en mi ArrayList es la misma en mi String[] del mensaje de texto, pero no sé cómo darme cuenta de eso.

¿Hay alguna manera fácil y rápida de verificar eso, también necesito saber qué cadena está en ambos?

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

¿podemos asignar valores directamente a la lista desde la función de división? – Jithu

Respuesta

15

Si usted tiene un String myString y un ArrayList<String> myListOfStrings, se puede comprobar si myString está en la lista como esta:

myListOfStrings.contains(myString); 

Esto devolverá un valor lógico (verdadero/falso) - true si se encuentran las cuerdas, falso si no

En el caso que se desea ejecutar a través de la matriz de cadenas y combinar cada uno de ellos a la SmileyList así:

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

thx para usted, pero ¿cómo me doy cuenta ahora, qué cadena tenía en ambos? – safari

+0

If 'if (SmileyList.contains (s))' devuelve 'true', la cadena que estaba en both es igual a' s'. – kaspermoerch

+0

sí, lo tengo, pero necesito saber qué cadena era. – safari

2

Puede iterar sobre la matriz (por ejemplo con un bucle for sobre splitted.length), la consulta de su lista con myList.contains(splitted[i]). La consulta devolverá un boolean.

Si es necesario comprobar si todos elementos de la matriz están presentes en la lista, hay una alternativa cómoda con myList.containsAll(Arrays.asList(splitted))

No hay otra alternativa concisa y sin bucle para comprobar si cualquier elemento de la matriz está presente en la lista:

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

splitList.isEmpty() luego volverá false, si cualquier artículo de las listas es coincidencia.

El contenido del splitList mostrará todas las cadenas que coincidan.

+0

Podría ser positivo agregar una condición de salida al ciclo para mayor eficiencia. El OP solo quiere saber si al menos un elemento está contenido en la lista. –

+0

definitivamente, sería positivo romper el ciclo una vez que tenga la respuesta. Simplemente consideré el flujo de control fuera del alcance de la pregunta – kostja

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

Si quieres hacer algo para cada partido, el código anterior trabajará. Si solo desea hacer algo una vez si hubo una coincidencia (y no para cada coincidencia), deberá agregar una declaración break en la oración if.

1

Dependiendo de qué tan grande sea su matriz y ArrayList y cuántas veces tendrá acceso a ellas, es posible que desee utilizar un HashSet en lugar de un ArrayList para poder buscarlo rápidamente con el método hash en lugar de tener para iterar a través de ArrayList. Algo como esto:

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; 
} 
Cuestiones relacionadas