Убедитесь, что 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;
}