2011-10-26 8 views
10

Właśnie zbudowałem odbiornik Broadcast, dzięki któremu mogę odbierać przychodzące wiadomości tekstowe, niż podzielić wiadomość tekstową, gdy jest spacja i zapisać ją w String[].Sprawdź, czy String w łańcuchu [] znajduje się w ArrayList <string>

Teraz muszę sprawdzić, czy w tym String[] jest coś z mojej bazy danych. W tym celu utworzyłem ArrayList<String>, który pobiera wszystkie wpisy z odpowiedniej kolumny. Teraz muszę sprawdzić, czy ciąg w moim ArrayList jest taki sam w moim String[] z wiadomości tekstowej, ale nie wiem, jak to zrealizować.

Czy istnieje łatwy i szybki sposób, aby to sprawdzić, również muszę wiedzieć, który ciąg jest w obu z nich?

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

Czy możemy przypisać wartości bezpośrednio do listy z funkcji podziału? – Jithu

Odpowiedz

15

Jeśli masz String myString oraz ArrayList<String> myListOfStrings, można sprawdzić, czy myString znajduje się na liście jak ten:

myListOfStrings.contains(myString); 

ta zwróci wartość logiczną (true/false) - prawda, jeśli stwierdzono struny, fałsz, jeśli nie.

W twoim przypadku byłoby chcesz uruchomić przez tablicę ciągów i dopasować każdy z nich do SmileyList jak ten:

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

thx dla ciebie, ale jak się dowiaduję, który String był w obu? – safari

+0

Jeśli 'if (SmileyList.contains (s))' zwraca 'true', łańcuch, który był w obu jest równy' s'. – kaspermoerch

+0

Tak, mam to, ale muszę wiedzieć, który String to był. – safari

2

Można iteracyjne nad tablicy (na przykład z for pętli nad splitted.length), odpytywanie listy z myList.contains(splitted[i]). Zapytanie zwróci wartość boolean.

Jeśli chcesz sprawdzić, czy wszystkie elementy w tablicy są obecne na liście, jest wygodny alternatywą z myList.containsAll(Arrays.asList(splitted))

Jest inna zwięzły alternatywa bez pętli, aby sprawdzić czy dowolny pozycjach tablica jest obecny na liście:

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

splitList.isEmpty() powróci false, jeśli dowolny element z list jest dopasowanie.

Zawartość splitList wyświetli wszystkie ciągi, które pasują do siebie.

+0

Może być dodatnie dodanie warunku wyjścia do pętli w celu zwiększenia wydajności. OP chce wiedzieć tylko, czy przynajmniej jeden element znajduje się na liście. –

+0

zdecydowanie, byłoby pozytywnie przerwać pętlę po otrzymaniu odpowiedzi - po prostu uważałem, że przepływ kontrolny wykracza poza zakres pytania: – kostja

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

Jeśli chcesz zrobić coś dla każdego meczu, powyższy kod będzie działać. Jeśli chcesz zrobić coś tylko raz, jeśli był mecz (a nie na każdy mecz), musisz dodać instrukcję break w zdaniu if.

1

Zależnie od tego, jak duża jest twoja tablica i ArrayList oraz ile razy będziesz mieć do nich dostęp, możesz użyć HashSet zamiast ArrayList, abyś mógł szybko wyszukać za pomocą zaszyfrowanej metody zamiast mieć iterować przez ArrayList. Coś takiego:

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