Убедитесь, что String в String [] находится в ArrayList <string>
Я только что построил широковещательный приемник, с помощью которого я могу получить входящие текстовые сообщения, чем разделить текстовое сообщение, когда есть место и сохранить его в String[]
.
Теперь мне нужно проверить, есть ли в этом String[]
что-то из моей базы данных. Для этого я создал a 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();
}
}
}
Ответы
Ответ 1
Если у вас есть 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.
}
}
Ответ 2
String array[] = ... ;
List<String> list = ... ;
// check if anything in array is in list
for(String str : array)
if(list.contains(str)) doSomething() ;
Если вы хотите что-то сделать для каждого матча, код выше будет работать. Если вы хотите что-то сделать один раз, если есть совпадение (а не для каждого соответствия), вам нужно добавить оператор break
в предложение if.
Ответ 3
Вы можете выполнить итерацию по массиву (например, с помощью цикла 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
покажет все строки, которые соответствуют.
Ответ 4
В зависимости от того, насколько велики ваш массив и 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;
}