2011-10-26 65 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

我们可以直接给分配函数赋值给List吗? – Jithu

回答

15

如果你有String myStringArrayList<String> myListOfStrings,您可以检查是否myString在列表如下:

myListOfStrings.contains(myString); 

这将返回一个布尔值(true/false) - 如果字符串被发现真实,如果不是,则为false

在你的情况,你会希望通过字符串数组来运行和匹配他们每个人的SmileyList这样的:

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

thx的范围,对于你来说,但是我怎么知道现在哪个字符串在它们两个中呢? – safari

+0

如果if(SmileyList.contains(s))返回'true',则两者中的字符串都等于's'。 – kaspermoerch

+0

是的,我知道了,但我需要知道它是哪个字符串。 – safari

2

您可以在阵列(例如,用for遍历splitted.length)在迭代,用myList.contains(splitted[i])查询列表。该查询将返回一个boolean

如果需要检查,如果阵列中的所有项目出现在列表中,有一个与myList.containsAll(Arrays.asList(splitted))

一个舒适的替代方案有没有循环检查另一简洁的选择,如果的任何项目阵列出现在名单:

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

splitList.isEmpty()将回false,如果任何项目清单的是匹配。

splitList的内容将显示所有匹配的字符串。

+0

为了提高效率,向循环添加退出条件可能是正确的。 OP只想知道列表中是否至少包含一个元素。 –

+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() ; 

如果您想为每一场比赛做一些事情,上面的代码将工作。如果您只想在事件匹配时做一些事情(而不是每次匹配),则需要在if语句中添加break语句。

1

根据你的数组和ArrayList的大小以及你将访问它们的次数,你可能想要使用HashSet而不是ArrayList,这样你就可以快速查找哈希方法而不是使用哈希方法遍历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; 
} 
相关问题