【问题标题】:String contains versus List contains字符串包含 vs 列表包含
【发布时间】:2020-02-13 20:20:48
【问题描述】:

我正在编写一个处理名称的应用程序。我想实现,如果列表中的项目包含“完全”相同的字符,那么应该返回 true。此外,如果输入包含“确切”名称后跟名称之后或之前的字符,则返回 true。例如输入“Sid”返回真,输入“iiSidee”返回真,但“id”返回假。

我更喜欢使用列表实现,但这并没有达到我的要求。但是,如果我选择 String.contains(...) 这非常好。任何建议将不胜感激。

public static boolean list(String input) {
    List<String> list = new ArrayList<>();
    list.add("Sid");
    list.add("Siddu");
    list.add("Kapil");

**EDIT:**
String[] inputs = input.split(" ");
// for every input item check in list

for(int = 0; i < inputs.length; i++) {
   if(inputs[i].contains(list) {
       return true;
   }
   else {
      return false;
  }
}

**ORIGINAL:**

    if(list.contains(input)) {
        return true;
    }
    return false;
}

【问题讨论】:

  • 正则表达式似乎对此很有用

标签: java string list


【解决方案1】:

按如下方式进行:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Tests
        System.out.println(list("Sid"));
        System.out.println(list("Siddu"));
        System.out.println(list("iiSidee"));
        System.out.println(list("id"));
        System.out.println(list("aaaKapil"));
        System.out.println(list("Kapil"));
        System.out.println(list("ii"));
    }

    public static boolean list(String input) {
        List<String> list = new ArrayList<String>();
        list.add("Sid");
        list.add("Siddu");
        list.add("Kapil");
        for (String s : list) {
            if (s != null && input != null) {
                if (input.equals(s) || input.contains(s)) {
                    return true;
                }
            }
        }
        return false;
    }
}

输出:

true
true
true
false
true
true
false

[更新]添加此更新以消除 @lainatnavi 的疑虑

public class Main {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        for (long i = 0; i < Integer.MAX_VALUE; i++)
            "hello".equals("hello");
        System.out.println("Time taken: " + (System.currentTimeMillis() - startTime) + " ms");

        startTime = System.currentTimeMillis();
        for (long i = 0; i < Integer.MAX_VALUE; i++)
            "hello".contains("hello");
        System.out.println("Time taken: " + (System.currentTimeMillis() - startTime) + " ms");
    }
}

输出:

Time taken: 498 ms
Time taken: 6405 ms

我在回答中使用if (input.equals(s) || input.contains(s)) 的原因是,如果input.equals(s) 返回true,则控件不会去检查input.contains(s),这将带来性能优势。

【讨论】:

  • (true || true) 总是正确的。 (false || false) 总是假的
  • @Arvind Kumar Avinash - 这种匹配它。基本上,情况正好相反。我需要首先拆分输入,并为每个输入检查它是否包含在列表中。
  • @lainatnavi - true || false 是 true。另外,false || true 是 true。
  • @ArvindKumarAvinash 评论指的是这一行input.equals(s) || input.contains(s)。如果您将结果与 input.contains(s) 与 OR 运算符结合使用,则无需检查 input.equals(s)。
  • @lainatnavi - 我添加了更新以消除您的疑问。我希望,它会有所帮助。
【解决方案2】:

如果输入是空格分隔的单词,则使用嵌套的 for 循环检查列表的任何元素是否包含在任何单词中。

for (String x : list) {
    for (String y : input.split(" ")) {
        if (x.contains(y)) return true;
    }
}
return false;

【讨论】:

  • 是的,它是空格分隔的单词 - 这是一个好主意。有没有其他方法可以避免出现 2 个循环?
  • 是的,可能它可以使用 Java 8 Streams 在一行中完成,但对我来说使用经典的 for 循环似乎更容易。
【解决方案3】:

您可以使用流 (Java 8) 轻松完成。此外,如果您将拥有大数据,则可以借助它来提高性能。

public static boolean list(String input) {
    List<String> list = new ArrayList<>();
    list.add("Sid");
    list.add("Siddu");
    list.add("Kapil");
    return list.stream().anyMatch(item -> item.equals(input) || input.contains(item));
}

【讨论】:

    【解决方案4】:

    你可以使用这个正则表达式 [S][I][D],这个代码 boolean b3 = Pattern.matches("[S][I][D]");

    【讨论】:

      【解决方案5】:

      这可能是问题所在,您没有比较列表中的每个项目,您应该这样做:

      public static boolean list(String input) {
      List<String> list = new ArrayList<>();
      list.add("Sid");
      list.add("Siddu");
      list.add("Kapil");
      
      for (int i = 0; i < list.length; i++) {
          if(list.get(i).contains(input)) {
              return true;
          }
          return false;
      }
      

      }

      【讨论】:

      • 感谢您的浏览。这行得通!但是,我需要拆分每个输入,并且需要检查该输入是否包含在列表中。我想避免 2 个单独的循环。这可能吗?所以基本上对于每个输入检查它是否包含在列表中,即“aaaKapil”返回true,“Kapil”返回true,“il”返回false。
      • @SidKumar 从原始问题看来您需要检查列表中的任何元素是否包含在输入字符串中,而不是相反。
      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多