【问题标题】:Check if String in String[] is in ArrayList<string>检查 String[] 中的字符串是否在 ArrayList<string> 中
【发布时间】:2011-12-15 13:15:23
【问题描述】:

我刚刚构建了一个广播接收器,我可以使用它来获取传入的短信,然后在有空间时将短信拆分并将其保存到String[]

现在我需要检查这个String[] 是否来自我的数据库。为此,我创建了一个ArrayList&lt;String&gt;,它从相应列中获取所有条目。现在我需要从短信中检查我的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();
            }                         
        }
    }

【问题讨论】:

  • 我们可以直接从 split 函数给 List 赋值吗??

标签: java android arraylist arrays


【解决方案1】:

您可以遍历数组(例如,使用for 循环遍历splitted.length),使用myList.contains(splitted[i]) 查询您的列表。查询将返回boolean

如果您需要检查数组中的所有项是否存在于列表中,myList.containsAll(Arrays.asList(splitted))

还有另一种简洁的替代方法,无需循环检查数组的 any 项是否存在于列表中:

List splitList = Arrays.asList(splitted);
splitList.retainAll(myList);
如果列表中的任何项目匹配,

splitList.isEmpty() 将返回 false

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

【讨论】:

  • 在循环中添加退出条件以提高效率可能是积极的。 OP 只想知道列表中是否包含至少一个元素。
  • 当然,一旦你得到答案,打破循环是积极的——我只是认为控制流超出了问题的范围
【解决方案2】:

根据您的数组和 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;
}

【讨论】:

    【解决方案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 语句。

    【讨论】:

      【解决方案4】:

      如果您有String myStringArrayList&lt;String&gt; 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.
         }
      }
      

      【讨论】:

      • 谢谢你的遮阳篷,但我现在怎么知道,他们两个中都有哪个字符串?
      • 如果if( SmileyList.contains( s ) ) 返回true,则两者中的字符串都等于s
      • 我不太确定我是否理解您的问题。您是否需要原始字符串中s 的索引/位置?您需要s 的值吗?需要splitteds的索引吗?
      • s 的值,我需要吗,我想。我需要知道 ArrayList 和 String[] 中的 String 是什么...明白了吗?
      • 好的 - 我会尝试更深入地解释。我们一一遍历数组splitted 中的字符串,为我们当前正在使用的字符串创建一个引用s。然后我们“询问”ArrayList SmileyList 是否包含等于s 的字符串。如果是这样,我们知道我们从splitted 得到的s(这意味着它在splitted)也在SmileyList 中,这意味着它在两者中。在ArrayListString[] 中的Strings。然后我们做在这种情况下需要做的事情。
      猜你喜欢
      • 2019-12-29
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2018-12-16
      • 2023-04-07
      • 2021-03-05
      相关资源
      最近更新 更多