2011-10-26 15 views
10

受信したテキストメッセージを受信できる放送受信機を作成したばかりで、スペースがあるときにテキストメッセージを分割してString[]に保存するよりも、文字列[]の文字列がArrayListにあるかどうかを確認する<string>

これで私のデータベースのものであるかどうかを確認する必要があります。String[]私はArrayList<String>を作成し、対応する列からすべての項目を取得しました。今私はArrayListの文字列が私のString[]のテキストメッセージと同じであるかどうかをチェックする必要がありますが、それを実現する方法はわかりません。

これを確認する簡単で迅速な方法はありますか、またどちらの文字列が両方にあるかを知る必要がありますか?

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

分割機能からリストに直接値を割り当てることができますか? – Jithu

答えて

15

あなたはString myStringArrayList<String> myListOfStringsを持っている場合、あなたはmyStringは、このようなリストであるかどうかを確認することができます

myListOfStrings.contains(myString); 

これは、(真/偽)ブール値を返します - 真の文字列が見つかった場合、そうでない場合はfalseです。あなたのケースでは

あなたは文字列の配列を介して実行し、このようなSmileyListにそれらのそれぞれにマッチしたい:

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

あなたはawnserのためのthxですが、どの文字列が両方の文字列にあったのかは分かりますか? – safari

+0

'if(SmileyList.contains(s))'が 'true'を返す場合、両方にあった文字列は' s'に等しくなります。 – kaspermoerch

+0

はい、私はそれを持っていましたが、私はどの文字列だったか知る必要があります。 – safari

2

あなたはmyList.contains(splitted[i])であなたのリストを照会、(例えばsplitted.length以上forループ付き)の配列を反復処理することができます。クエリはbooleanを返します。

あなたは、アレイ内のすべての項目がリストに存在しているかどうかを確認する必要がある場合は、チェックするためにループのない別の簡潔な選択肢がありmyList.containsAll(Arrays.asList(splitted))

と快適な選択肢がありのいずれかの項目場合配列は、リスト内に存在している:リストの任意の項目がある場合

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

splitList.isEmpty()はその後、falseを返します。マッチング

splitListの内容は、一致したすべての文字列を表示します。

+0

効率を上げるためループに終了条件を追加することは肯定的かもしれません。 OPは少なくとも1つの要素がリストに含まれているかどうかを知りたいだけです。 –

+0

確かに答えが出たらループを壊すのは肯定的でしょう。質問の範囲外の制御フローを考慮しています。 – kostja

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

あなたはすべての試合のために何かをしたい場合は、上記のコード働くでしょう。一致があった場合(そして一致する場合のみではなく)何かをしたい場合は、break文をif文に追加する必要があります。

1

あなたの配列とArrayListの大きさとそれらにアクセスする回数によっては、ハッシュされたメソッドを高速に検索できるように、ArrayListの代わりにHashSetを使用することができますArrayListを反復処理します。このようなもの:

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; 
} 
関連する問題