设置两个字符串的交集

时间:2012-12-15 16:54:45

标签: java set

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()方法用于查找常用字符。

任何人都可以帮我减少代码行。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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删除string1string2中的所有字符。因此commonChars

itaahan

更多this discussion

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

ithan

这个正则表达式如何运作的重大细分在this discussion

编译正则表达式相对计算成本昂贵,因此我们可以将其编译为static final Pattern。由于其他正则表达式基于输入,因此无法进行预编译。

答案 2 :(得分:1)

我想你可以压缩这个:

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

进入:(已编辑)

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

答案 3 :(得分:1)

更简单一点:

    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 :(得分:0)

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

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;
}