【问题标题】:Set intersection of two strings [duplicate]设置两个字符串的交集[重复]
【发布时间】:2015-02-27 14:53:33
【问题描述】:
import java.util.*;

class set {
    public static void main(String args[]) {
        TreeSet<Character> t1 = new TreeSet<Character>();
        TreeSet<Character> t2 = new TreeSet<Character>();
        String s1 = "Ambitab bachan";
        String s2 = "Ranjikanth";
        for (char c1 : s1.toCharArray())
            t1.add(c1);
        for (char c2 : s2.toCharArray())
            t2.add(c2);
        t2.retainAll(t1);
        System.out.println(t2);
    }
}

这个程序在两个不同的字符串中找到共同的字符。在这个程序中,TreeSet 用于存储值,retainAll() 方法用于查找常用字符。

谁能帮我减少代码行。

【问题讨论】:

  • 除了将多个语句放在同一行之外,要减少行数会很困难。特别是,toCharArray 返回一个char[],因此您需要在某个阶段的循环中将每个char 转换为Character
  • 在同一行声明两个变量?单行不同的语句?
  • 您为什么担心减少明显不适合生产的代码行数?这是您要评价的指标吗?

标签: java set


【解决方案1】:

如果您使用 Guava 库,您可以简单地使用 Sets.intersection() 并避免使用样板。

【讨论】:

  • 我是一名java初学者。请提出一些有助于提高我在 Java 中的编程技能的想法。提前致谢。我应该买什么样的书..
【解决方案2】:

在处理字符串时,您可以放弃所有这些对象并使用正则表达式。

private static final Pattern REGEX_DEDUPLICATE = Pattern.compile("(.)(?=.*\\1)");

public void intersect(String string1, String string2) {
    String commonChars = string1.replaceAll("[^" + string2 + "]", "");
    String uniqueCommonChars = REGEX_DEDUPLICATE.matcher(commonChars).replaceAll("");
    return uniqueCommonChars;
}

第一个replaceAll 删除string1 中所有不是string2 中的字符。 commonChars 是这样的:

itaahan

this discussion 中的更多内容。

第二个replaceAll 删除了一个字符的冗余实例,在这种情况下是最后两个'a'。 uniqueCommonChars 变为:

ithan

this discussion 中对这个正则表达式的工作原理进行了很好的分解。

编译正则表达式相对计算量很大,因此我们可以将其预编译为static final Pattern。由于其他正则表达式是基于输入的,因此无法预编译。

【讨论】:

    【解决方案3】:

    简单一点:

        TreeSet<Character> t1 = new TreeSet<Character>();
        String s1 = "Ambitab bachan";
        String s2 = "Ranjikanth";
        for(char c1:s1.toCharArray()) {
          if (s2.contains(new Character(c1).toString())) {
            t1.add(c1);
          }
        }
    

    【讨论】:

      【解决方案4】:

      我想你可以浓缩一下:

      TreeSet<Character> t1 = new TreeSet<Character>();
      for(char c1:s1.toCharArray())
      t1.add(c1);
      

      进入:(已编辑)

      TreeSet<String> t1 = new TreeSet<String>(Arrays.asList(s1.split("(?<=.)")));
      

      【讨论】:

      • asList 将采用 Character[] 而不是 char[]
      • 啊,你是对的,转换为Character[] 可以让它和原来的一样长,不管你想到什么方法。谢谢。
      • 好吧,这个版本应该可以工作(这次实际测试确定)。虽然丑。不建议实际做这种事情......
      • 我在想.split(""),但我认为这会在开始时产生一个空字符串。
      • 是的,我在第一次尝试时遇到了这个问题,但是使用后视,s1.split("(?&lt;=.)") 解决了这个问题。
      【解决方案5】:

      您可以轻松删除重复代码以构建字符集

      public static void main(String args[]) {
          TreeSet<Character> t1 = asCharacterSet("Ambitab bachan");
          TreeSet<Character> t2 = asCharacterSet("Ranjikanth");
          t2.retainAll(t1);
          System.out.println(t2);
      }
      
      private static Set<Character> asCharacterSet(String value) {
          TreeSet<Character> t1 = new TreeSet<Character>();
          for (char c1 : value.toCharArray())
              t1.add(c1);
          return t1;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        相关资源
        最近更新 更多