【问题标题】:Check if String contains part of other string Java检查 String 是否包含其他字符串 Java 的一部分
【发布时间】:2017-09-08 07:30:59
【问题描述】:

我在我的 Java 应用程序中定义了一些字符串,如下所示:

 m3 = "T, V, E";
 m2 = "T, W, E";

举个例子。

现在我需要检查字符串的哪些部分匹配。所以在这种情况下,我想要一个字符串m4,结果包含T, E

以这种情况为例:

m1 = "A, S";
m3 = "T, V, E";

我想要一个空的(但声明的)字符串。

或者有没有更好的方法,用另一种方法,然后用字符串?我实际上是手动声明这些字符串。数组会更好吗?如果是的话,我怎么能用数组来做呢?

【问题讨论】:

  • 到目前为止你得到了什么?这只是你的任务
  • @Stultuske 我尝试使用 substr() 进行检查,但基本上这不是我想要的,因为我需要检查“单个字母”(用逗号分隔)而不是“字符串”
  • 听起来你想要两个集合的交集。 (Set有一个集合类)
  • 再想一想,最好将这些变量声明为字符数组。但是有没有办法检查哪些数组元素匹配?
  • 或@PatrickParker 我该怎么做?

标签: java arrays string


【解决方案1】:

在 Java 8 中,您可以进行如下操作:

    String s1 = "T,V,E";
    String s2 = "T,W,E";

    List<String> l1 = Arrays.asList(s1.split(","));
    List<String> l2 = Arrays.asList(s2.split(","));

    List<String> result = l1.stream().filter(l2::contains).collect(Collectors.toList());

    System.out.println(String.join(",", result));

结果如预期的那样是“T,E”。

【讨论】:

    【解决方案2】:

    您可以通过多种方式实现这一目标。其中一种方法是使用 Set

    首先,用(逗号)分割m1个字符,并将其添加到HashSet。然后拆分 m2 个字符并将其添加到 ArrayList。现在通过 for 循环尝试将 ArrayList 字符添加到 HashSet。如果未添加(因为字符已经存在),您将从 add 方法 (Set.add()) 中得到 false。如果你得到错误的打印字符或将其添加到另一个 ArrayList。

            String m3 = "T, V, E";
            String m2 = "T, W, E";
    
            Set<String> set = new HashSet<>(Arrays.asList(m3.split(",")));
            List<String> list = Arrays.asList(m2.split(","));
            for (String s : list) {
                if (!set.add(s)) {
                    System.out.println(s);
                }
            }
    

    结果将是 T 和 E

    【讨论】:

      【解决方案3】:

      合适的数据结构是Set。

          Set<String> m3 = new TreeSet<>();
          Collections.addAll(m3, "T", "V", "E");
          Collections.addAll(m3, "T, V, E".split(",\\s*")); // Alternatively.
      
          Set<String> m2 = new HashSet<>();
          Collections.addAll(m2, "T", "W", "E");
      
          Set<String> m5 = new TreeSet<>(m2);
          m5.retainAll(m3);
      

      Java 9:

          Set<String> m3 = Set.of("T", "V", "E");
          Set<String> m2 = Set.of("T", "W", "E");
      

      【讨论】:

        【解决方案4】:

        你可以像下面这样使用 split() 函数

        String a="A, B, C, D";
                String b="B, C, D";
                String[] a_chars =a.split(", "); //returns array with A B C D
                String[] b_chars =b.split(", "); //returns array with B C D
        

        现在你有 2 个字符串数组,你可以使用 2 个 (for) 循环来比较它们

        String result="";
                for(int c=0;c<a_chars.length;c++)
                {
                    for(int d=0;d<b_chars.length;d++)
                    {
                        if(a_chars[c].equals(b_chars[d]))
                        {
                            result+=a_chars[c]+", ";
                        }
                    }
                }
        

        现在你有这样的结果字符串result="B, C, D, "

        检查结果的长度是否大于零 如果是这样,请删除 , 的最后 2 个字符

        if(result.length()>0)result=result.substring(0,result.length()-2);
        

        如果结果字符串的长度为零,则表示没有匹配的字母,因此无需修改它

        【讨论】:

          【解决方案5】:

          如果您的所有 String 都遵循以下模式:..., ..., ....,您可以拆分它们并仅过滤两个数组中包含的每个字符串。
          然后,您可以将它们收集到 List 并与 , 一起加入:

          List<String> commonStrings = Arrays.stream(m2.split(",\\s"))
                .flatMap(s-> Arrays.stream(m3.split(",\\s"))
                .filter(s2.equals(s)))          
                .collect(Collectors.toList());
          
          String joinedString = String.join(",", commonStrings);
          

          请注意,此代码不会返回两个 Strings 中出现的确切相等次数。
          因此,如果一个String 包含两个A 和另一个A,您将在结果中得到两个A
          如果没关系并且您只想获得不同的String,您可以在collect() 之前调用distinct()

          否则,要在处理过程中返回确切的相等次数,只要消耗了String 部分(例如A),因为这两个部分在两个Strings 中相等,您可以创建新的Strings 来自实际的 Strings,但删除了这个 String 部分。

          【讨论】:

            【解决方案6】:

            字符串 s1 = "T,V,E"; 字符串 s2 = "T,W,E";

            List<String> l1 = Arrays.asList(s1.split(","));
            List<String> l2 = Arrays.asList(s2.split(","));
            
            List<String> result = l1.stream().filter(l2::contains).collect(Collectors.toList());
            
            System.out.println(String.join(",", result));
            

            结果 = T&E 这是一个很好的答案,我也会告诉你这个

            【讨论】:

              猜你喜欢
              • 2011-09-19
              • 2018-08-27
              • 2019-01-04
              • 2017-08-15
              • 2017-02-06
              • 2017-05-12
              • 2021-03-05
              • 2013-03-14
              • 2019-08-06
              相关资源
              最近更新 更多