【问题标题】:Search strings that contain a string in an array in java [closed]在java中的数组中搜索包含字符串的字符串[关闭]
【发布时间】:2021-09-27 21:18:43
【问题描述】:

考虑下面的字符串数组:
String[] items = new String[] {"Dani","Liam", "Noah" , "Elijah" , "Emma", "Ava Olivia"};
我想在这个数组中搜索。例如,我想查找所有以 D 开头的项目或其中包含单个 D 的项目。
当我搜索 E 时,结果必须是 {"Elijah","Emma"} 而当我搜索 Em 时, Elijah 将删除,结果必须是 {"Emma"}
当我搜索 Olivia 时,结果必须是 {"Ava Olivia"}
我试图用 SPACE 分割数组并将所有单词保存在二维数组中,然后我可以检查每个单词的第一个字母。我的方式有一些错误。
感谢所有建议。

PS:请注意,我正在开发一个需要此功能的 android 应用程序。

【问题讨论】:

  • 你能告诉我们一些尝试吗?
  • 请添加您的代码以及您在调试过程中发现的所有内容。
  • 请给我们您想要的整个过滤逻辑。我在上面看到了多个规则。

标签: java android algorithm search data-structures


【解决方案1】:

一种方法使用带有过滤逻辑的流:

String[] items = new String[] {"Dani","Liam", "Noah" , "Elijah" , "Emma", "Ava Olivia"};
List<String> matches = Arrays.stream(items)
                             .filter(i -> i.startsWith("Em"))
                             .collect(Collectors.toList());

您可以在对filter(...) 的调用中应用您想要的任何过滤逻辑。

【讨论】:

  • 不适用于Olivia,不应该是contains 而不是startsWith
  • 但这不会涵盖必须返回“Ava Olivia”的情况“Olivia”
  • @BothOfYou OP 出现(至少对我而言)提供了多种过滤逻辑。我不确定这个问题只有一个答案。
  • 是的,可以这样解释……读过cmets的人可能会得出自己的结论。
  • @TimBiegeleisen 有用,但我应该添加更多过滤器来找到 Olivia
【解决方案2】:

这应该适用于所有情况:

String[] items = new String[] {"Dani","Liam", "Noah" , "Elijah" , "Emma", "Ava Olivia"};
String searchterm = "Olivia"; 
List<String> matches = Arrays.stream(items)
        .filter(i -> {
            boolean match = false;
            for(String token: i.split("\\s+")){
                if (token.startsWith(searchterm)) {
                    match = true;
                    break;
                }
            }
            return match;
        })
        .collect(Collectors.toList());

简化(所有流)版本:

String[] items = new String[] {"Dani","Liam", "Noah" , "Elijah" , "Emma", "Ava Olivia"};
String searchterm = "Olivia";
List<String> matches = Arrays.stream(items)
        .filter(i -> Arrays.stream(i.split("\\s+")).anyMatch(token -> token.startsWith(searchterm)))
        .collect(Collectors.toList());

【讨论】:

    【解决方案3】:

    这是您程序的解决方案。

    此技术还可以检查名称中间的搜索字符串的实例。

    String[] names={"Dani","Liam", "Noah", "Elijah", "Emma", "Ava Olivia"};// The names to be search in
    
    Scanner in=new Scanner(System.in);
    String search=in.next();//The word input for filtering the names
    
    ArrayList<String> filered=new ArrayList<String>();
    for(int i=0;i<names.length;i++){
        if(names[i].contains(search))
            filtered.add(names[i]);
    }
    
    System.out.println(filtered);
    

    此代码不仅会检查名称是否以搜索词开头,还会检查名称中是否包含名称中间的词

    过滤后的名称存储在此处命名为过滤的 ArrayList 中。您可以使用存储在 ArrayList 中的过滤后的单词做任何您想做的事情

    【讨论】:

      【解决方案4】:
      public static Object[] searchItem(String[] items, String searchStr) {
        ArrayList<String> searchedItem = new ArrayList<>();
        for(String string: items) {
          if (string.toLowerCase().contains(searchStr.toLowerCase())) {
              searchedItem.add(string);
          }
        } 
        
        return searchedItem.toArray(new String[0]);
      }
      

      【讨论】:

        【解决方案5】:

        这是一个使用流 API 作为其他答案之一的示例,但使用 contains 而不是 startsWith 以便在搜索词为 "Olivia" 时找到 "Ava Olivia"

        public static List<String> findIn(String filterBy, String[] searchIn) {
            return Arrays.stream(searchIn)
                         .filter(item -> item.contains(filterBy))
                         .collect(Collectors.toList());
        }
        

        您可以在main 方法中这样使用它:

        public static void main(String[] args) throws Exception {
            String[] items = new String[] {"Dani","Liam", "Noah" , "Elijah" , "Emma", "Ava Olivia"};
            
            System.out.println(String.join(", ", findIn("Olivia", items)));
        }
        

        这个例子的输出是

        Ava Olivia
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-25
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 1970-01-01
          • 2016-11-15
          • 1970-01-01
          • 2021-07-09
          相关资源
          最近更新 更多