【问题标题】:How to search for a string in an arraylist如何在arraylist中搜索字符串
【发布时间】:2012-01-01 19:43:19
【问题描述】:

我想在数组列表中搜索一个字符串。 我的 ArrayList 包含:

ArrayList <String> list = new ArrayList(); 
list.add("behold");
list.add("bend");
list.add("bet");
list.add("bear");
list.add("beat");
list.add("become");
list.add("begin");

现在我想搜索"bea",它应该返回一个包含"bear""beat" 的列表。 如何实现?

【问题讨论】:

    标签: java regex search arraylist


    【解决方案1】:

    尝试使用 Google guava 库 更多信息 --> https://github.com/google/guava

    Iterable<String> result = Iterables.filter(yourListContainStringsYouWantToSearch, Predicates.containsPattern(search));
    Log.i("resultsInList", "performSearch:\n"+ Lists.newArrayList(result.iterator()));
    

    【讨论】:

      【解决方案2】:

      如今,Java 8 允许使用单行函数式解决方案,该解决方案比公认的解决方案更清洁、更快、更简单:

      List<String> list = new ArrayList<>();
      list.add("behold");
      list.add("bend");
      list.add("bet");
      list.add("bear");
      list.add("beat");
      list.add("become");
      list.add("begin");
      
      List<String> matches = list.stream().filter(it -> it.contains("bea")).collect(Collectors.toList());
      
      System.out.println(matches); // [bear, beat]
      

      在 Kotlin 中甚至更容易:

      val matches = list.filter { it.contains("bea") }
      

      【讨论】:

      • Stream 需要 Android Api 级别 > 24。
      • 错了。它需要 24 或更大。 ( >= )
      【解决方案3】:
      List <String> list = new ArrayList();  
                 list.add("behold"); 
                 list.add("bend"); 
                 list.add("bet"); 
                 list.add("bear"); 
                 list.add("beat"); 
                 list.add("become"); 
                 list.add("begin");
      
                 List <String> listClone = new ArrayList<String>(); 
                 Pattern pattern = Pattern.compile("bea",Pattern.CASE_INSENSITIVE); //incase u r not concerned about upper/lower case
                 for (String string : list) {
                     if(pattern.matcher(string).find()) {
                         listClone.add(string);
                         continue;
                     }
                 }
              System.out.println(listClone);
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      • 它非常简单,我编译了一个 Pattern 对象 (Pattern.compile("bea",Pattern.CASE_INSENSITIVE)),并使用 'bea' 作为我的输入,我希望它忽略搜索模式的情况。接下来,我将此模式与列表 1 中的所有字符串逐一匹配,并通过 find() 方法检查是否至少有 1 个匹配项,如果有,则将匹配的字符串添加到新列表中,即 listClone。
      【解决方案4】:

      首先你必须从 AdapterArrayList 复制到 tempsearchnewArrayList (将 ListView 项添加到 tempsearchnewArrayList 中),因为只有你可以比较搜索文本是否出现在 Arraylist 中。

      创建临时数组列表后,添加以下代码。

          searchEditTextBox.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
              }
              @Override
              public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                  String txt = charSequence.toString().trim();
                  int txtlength = txt.length();
                  if (txtlength > 0) {
                      AdapterArrayList = new ArrayList<HashMap<String, String>>();
                      for (int j = 0; j< tempsearchnewArrayList.size(); j++) {
                          if (tempsearchnewArrayList.get(j).get("type").toLowerCase().contains(txt)) {
                              AdapterArrayList.add(tempsearchnewArrayList.get(j));
                          }
                      }
                  } else {
                      AdapterArrayList = new ArrayList<HashMap<String, String>>();
                      AdapterArrayList.addAll(tempsearchnewArrayList);
                  }
                  adapter1.notifyDataSetChanged();
                  if (AdapterArrayList.size() > 0) {
                      mainactivitylistview.setAdapter(adapter1);
                  } else {
                      mainactivitylistview.setAdapter(null);
                  }
      
              }
              @Override
              public void afterTextChanged(Editable editable) {
      
              }
          });
      

      【讨论】:

        【解决方案5】:

        使用 java.util.HashSet 可能更容易。例如:

          List <String> list = new ArrayList<String>(); 
          list.add("behold");
          list.add("bend");
          list.add("bet");
        
          //Load the list into a hashSet
          Set<String> set = new HashSet<String>(list);
          if (set.contains("bend"))
          {
            System.out.println("String found!");
          }
        

        【讨论】:

          【解决方案6】:

          我见过的最好的订单:

          // SearchList is your List  
          // TEXT is your Search Text
          // SubList is your result
          
                              ArrayList<String> TempList = new ArrayList<String>(
                                      (SearchList));
                              int temp = 0;
                              int num = 0;
                              ArrayList<String> SubList = new ArrayList<String>();
                              while (temp > -1) {
                                  temp = TempList.indexOf(new Object() {
                                      @Override
                                      public boolean equals(Object obj) {
                                          return obj.toString().startsWith(TEXT);
                                      }
                                  });
                                  if (temp > -1) {
                                   SubList.add(SearchList.get(temp + num++));
                                   TempList.remove(temp);
                                  }
                              }
          

          【讨论】:

          • 您可以使用 .StartsWith 、 .equals 或 .contains 代替
          【解决方案7】:
          import java.util.*;
          class ArrayLst
          {
              public static void main(String args[])
              {
                  ArrayList<String> ar = new ArrayList<String>();
                  ar.add("pulak");
                  ar.add("sangeeta");
                  ar.add("sumit");
          System.out.println("Enter the name:");
          Scanner scan=new Scanner(System.in);
          String st=scan.nextLine();
          for(String lst: ar)
          {
          if(st.contains(lst))
          {
          System.out.println(st+"is here!");
          break;
          }
          else
          {
          System.out.println("OOps search can't find!");
          break;
          }
          }
          }
          }
          

          【讨论】:

            【解决方案8】:
             List <String> list = new ArrayList();  
                       list.add("behold"); 
                       list.add("bend"); 
                       list.add("bet"); 
                       list.add("bear"); 
                       list.add("beat"); 
                       list.add("become"); 
                       list.add("begin");
            
                       List <String> listClone = new ArrayList<String>(); 
                       for (String string : list) {
                           if(string.matches("(?i)(bea).*")){
                               listClone.add(string);
                           }
                       }
                    System.out.println(listClone);
            

            【讨论】:

            • 它的工作,但如果列表包含熊,则它不匹配
            • 只是你必须改变正则表达式,假设你想匹配 smal 'b' 和大写 'B' 然后替换 "(bea).*" "(b|B)(ea) .*".
            • 还有另一种方法可以使上述表达式不区分大小写,使用 "(?i)(bea).*"。
            【解决方案9】:

            更好的方法是对数组的每个字符串元素使用matches() 方法。这将帮助您通过正则表达式搜索任何模式。

            【讨论】:

              【解决方案10】:

              由于您的列表似乎没有排序,因此您必须遍历其元素。将startsWith()contains() 应用于每个元素,并将匹配项存储在辅助列表中。完成后返回辅助列表。

              【讨论】:

                【解决方案11】:

                遍历您的列表并执行包含或开头。

                ArrayList<String> resList = new ArrayList<String>();
                String searchString = "bea";
                
                for (String curVal : list){
                  if (curVal.contains(searchString)){
                    resList.add(curVal);
                  }
                }
                

                您可以将其包装在一个方法中。 contains 检查它是否在列表中。你也可以选择startswith。

                【讨论】:

                • 不应该 String curVal : list 阅读:String curVal resList 并且不应该仅在当前不是的情况下将 curVal 添加到列表中在列表中?
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-08-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多