我刚刚构建了一个广播接收器,我可以使用它来获取传入的文本消息,而不是在有空格时拆分文本消息并将其保存到String[]
。
现在我需要检查此String[]
中是否有来自我的数据库的内容。为此,我创建了一个ArrayList<String>
,它从相应的列中获取所有条目。现在我需要检查ArrayList
中的String[]
中的字符串是否与来自短信的 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();
}
}
}
相同,但我不知道如何实现。
有没有一种简单快捷的方法来检查,我还需要知道它们中的哪个字符串?
SmileySmsReceiver:
{{1}}
答案 0 :(得分:15)
如果您有String myString
和ArrayList<String> myListOfStrings
,则可以检查列表中是否有myString
,如下所示:
myListOfStrings.contains( myString );
这将返回一个布尔值(true / false) - 如果找到字符串则为true,否则返回false。
在你的情况下,你想要遍历字符串数组并将它们中的每一个匹配到SmileyList
,如下所示:
for( String s : splitted ) {
if( SmileyList.contains( s ) ) {
//Do what you need to do if the string is in the SmileyList.
}
}
答案 1 :(得分: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
语句。
答案 2 :(得分: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
的内容将显示所有匹配的字符串。
答案 3 :(得分:1)
根据数组和ArrayList的大小以及访问它们的次数,您可能希望使用HashSet而不是ArrayList,以便使用散列contains()
方法快速查找而不是必须遍历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;
}