2011-10-26 35 views
10

Tôi vừa tạo Bộ thu phát mà tôi có thể nhận tin nhắn văn bản đến, hơn là tôi chia tin nhắn văn bản khi có khoảng trắng và lưu vào String[].Kiểm tra xem Chuỗi trong Chuỗi [] có nằm trong ArrayList <string>

Bây giờ tôi cần kiểm tra xem trong số này String[] có phải là thứ gì đó từ cơ sở dữ liệu của tôi hay không. Đối với điều đó tôi đã tạo ra một ArrayList<String>, nhận tất cả các mục nhập từ cột tương ứng. Bây giờ tôi cần phải kiểm tra xem một chuỗi trong ArrayList của tôi là như nhau trong String[] của tôi từ tin nhắn văn bản, nhưng tôi không biết làm thế nào để nhận ra điều đó.

Có cách nào dễ dàng và nhanh chóng để kiểm tra điều đó không, tôi có cần biết Chuỗi nào nằm trong cả hai?

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

chúng ta có thể gán giá trị trực tiếp cho Danh sách từ chức năng phân tách không ?? – Jithu

Trả lời

15

Nếu bạn có một String myString và một ArrayList<String> myListOfStrings, bạn có thể kiểm tra xem myString nằm trong danh sách như thế này:

myListOfStrings.contains(myString); 

này sẽ trả về một boolean (true/false) - true nếu chuỗi được tìm thấy, sai nếu không.

Trong trường hợp của bạn, bạn sẽ muốn chạy qua các mảng của chuỗi và phù hợp với mỗi người trong số họ đến SmileyList như thế này:

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

thx cho bạn awnser, nhưng làm thế nào tôi tìm ra bây giờ, String trong cả hai người trong số họ? – safari

+0

Nếu 'if (SmileyList.contains (s))' trả về 'true', chuỗi trong cả hai bằng' s'. – kaspermoerch

+0

vâng tôi đã nhận được điều đó, nhưng tôi cần biết Chuỗi đó là gì. – safari

2

Bạn có thể lặp qua mảng (ví dụ với một vòng lặp for qua splitted.length), truy vấn danh sách của bạn với myList.contains(splitted[i]). Truy vấn sẽ trả lại một boolean.

Nếu bạn cần phải kiểm tra xem tất cả mục trong mảng có mặt trong danh sách, có một thay thế thoải mái với myList.containsAll(Arrays.asList(splitted))

Có một thay thế ngắn gọn mà không cần vòng lặp để kiểm tra xem bất kỳ mục tương ứng của mảng có mặt trong danh sách:

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

splitList.isEmpty() sau đó sẽ trở lại false, nếu bất kỳ mục của danh sách là phù hợp.

Nội dung của splitList sẽ hiển thị tất cả các chuỗi đã khớp.

+0

Có thể là tích cực để thêm điều kiện thoát vào vòng lặp cho hiệu quả. OP chỉ muốn biết nếu có ít nhất một phần tử được chứa trong danh sách. –

+0

chắc chắn, nó sẽ là tích cực để phá vỡ vòng lặp một khi bạn có câu trả lời - Tôi chỉ đơn giản coi là kiểm soát dòng chảy bên ngoài phạm vi của câu hỏi – kostja

3
String array[] = ... ; 
List<String> list = ... ; 
// check if anything in array is in list 
for(String str : array) 
    if(list.contains(str)) doSomething() ; 

Nếu bạn muốn làm điều gì đó cho mỗi trận đấu, các mã trên sẽ làm việc. Nếu bạn chỉ muốn làm một cái gì đó một lần nếu có một trận đấu (và không phải cho mỗi trận đấu), bạn sẽ cần phải thêm một tuyên bố break trong câu nếu.

1

Tùy thuộc vào mảng và ArrayList của bạn lớn bao nhiêu lần và bạn sẽ truy cập chúng như thế nào, bạn có thể muốn sử dụng HashSet thay vì ArrayList để bạn có thể xem nhanh phương thức băm thay vì để lặp qua ArrayList. Một cái gì đó như thế này:

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; 
} 
Các vấn đề liên quan