String 如何在Java中创建更优雅的函数,从两个字符串中获得相等的字母?

String 如何在Java中创建更优雅的函数,从两个字符串中获得相等的字母?,string,string-formatting,string-split,java,String,String Formatting,String Split,Java,我在Java中找不到标准字符串函数来查找两个字符串中的匹配字母 你知道如何使下面的代码更小/使用一些标准函数重构它吗 我只做了一个最简单的函数:比较第一个字符串的每个字母和第二个字符串的每个字母 public static void compare_letters(String name1, String name2) { int equal_letters = 0 ; for(int i = 0 ; i < name1.length() ; i++) { String c

我在Java中找不到标准字符串函数来查找两个字符串中的匹配字母

你知道如何使下面的代码更小/使用一些标准函数重构它吗

我只做了一个最简单的函数:比较第一个字符串的每个字母和第二个字符串的每个字母

public static void compare_letters(String name1, String name2) {
  int equal_letters = 0 ;
  for(int i = 0 ; i < name1.length() ; i++) {
    String current_letter  = name1.substring(i,i+1);

    for(int j = 0 ; j < name2.length() ; j++) {
      if(current_letter.equals(name2.substring(j,j+1)))
        equal_letters++ ;
    }
  }
  System.out.println("num of equal letters " + equal_letters) ;
}

public static void main(String args[]) {
  String n1 = "abc";
  String n2 = "bcd";
  compare_letters(n1,n2);
}
公共静态无效比较字母(字符串名称1、字符串名称2){
整数等于字母=0;
对于(int i=0;i
我如何重构它以使其更小-我确信一定有一些优雅的方法来做到这一点!这是一个非常普通的过程——必须有一个优雅的方法来做到这一点

这应该足够了

    int count = 0;
    for (char c : n1.toCharArray()) {
        if (n2.contains(String.valueOf(c))) {
            count++;
        }
    }

您的代码可以简化一点:

public static void compare_letters(String name1, String name2) {
    int equal_letters = 0 ;

    for( char c1 : name1.toCharArray() )
        for( char c2 : name2.toCharArray() )
            if( c1 == c2 ) equal_letters++;

    System.out.println("num of equal letters " + equal_letters);
}
但请注意,这种比较方式会重复计算重复字母,例如,将
“aa”
“aa”
进行比较将返回四个,因为一个字符串中的每个
a
将与另一个字符串中的每个
a
进行比较

如果你想在不重复计数的情况下计算普通字母,你需要做如下操作

public static void compare_letters(String name1, String name2) {

    // Declare a couple of sets: sets don't allow duplicate elements.
    Set<Character> letters1 = new HashSet<Character>();
    Set<Character> letters2 = new HashSet<Character>();

    // Populate the sets with the letters from the strings.
    for( char c : name1.toCharArray() ) letters1.add(c);
    for( char c : name2.toCharArray() ) letters2.add(c);

    // remove anything that isn't in letters2 from letters1
    letters1.retainAll(letters2);

    // letters1 is now the set of letters that appear in both names.
    // Its size is the number of common letters.
    System.out.println("num of equal letters " + letters1.size(););
}
公共静态无效比较字母(字符串名称1、字符串名称2){
//声明两个集合:集合不允许重复元素。
Set letters1=新的HashSet();
Set letters2=新的HashSet();
//用字符串中的字母填充集合。
对于(char c:name1.toCharArray())letters1.add(c);
对于(char c:name2.toCharArray())letters2.add(c);
//从字母1中删除字母2以外的任何内容
字母1.保留(字母2);
//letters1现在是出现在两个名称中的字母集。
//它的大小是普通字母的数量。
System.out.println(“相等字母数”+字母1.size(););
}

我认为最优雅的解决方案是使用番石榴的交叉法:

public static void compare_letters(String name1, String name2) {
    Set<Character> set1= new HashSet<Character>();
    for(char c : name1.toCharArray()) {
        set1.add(c);
    }

    Set<Character> set2 = new HashSet<Character>();
    for(char c : name1.toCharArray()) {
        set2.add(c);
    }

    System.out.println(Sets.intersection(set1, set2));
}
公共静态无效比较字母(字符串名称1、字符串名称2){
Set set1=新的HashSet();
for(char c:name1.toCharArray()){
第1组.加入(c);
}
Set set2=新的HashSet();
for(char c:name1.toCharArray()){
第2组.加入(c);
}
系统输出打印LN(集合交叉点(集合1,集合2));
}

如果将“aa”与“aa”进行比较,原始代码将给出4。但是,带有Set#retainal的代码将给出1,这可能也不正确。以下代码将给出2:

char[] letters1 = name1.toCharArray();
char[] letters2 = name2.toCharArray();

Arrays.sort(letters1);
Arrays.sort(letters2);

int index1 = 0;
int index2 = 0;
int sameLetters = 0;
while ((index1 < letters1.length) && (index2 < letters2.length)) {
  switch (Integer.signum(Character.compare(letters1[index1], letters2[index2])))
  {
    case -1: // Letter from name1 before letter from name2
      ++index1;
      break;
    case 0: // Same letters in name1 and name2
      ++index1; ++index2;
      ++sameLetters;
      break;
    case 1: // Letter from name1 after letter from name2
      ++index2;
      break;
  }
}
System.out.println("Same letters: " + sameLetters);
char[]letters1=name1.toCharArray();
char[]letters2=name2.toCharArray();
数组。排序(字母1);
数组。排序(letters2);
int index1=0;
int index2=0;
int sameLetters=0;
而((index1
如果要比较字母,请使用
char
char
是一个字母,因此使用它比使用长度为1的
String
更有意义。对于初学者,请注意,从Java 1.7.0_07开始,
substring
方法创建了一个全新的
String
,因此您应该使用
charAt
而不是
substring
,然后你可以用
==
而不是
equals
。这个代码在功能上并不等同于发布的代码。对于输入{“nnn”,“nnn”},您的代码生成3个匹配项,而他的代码生成9个匹配项。最后一行不起作用!什么是布景?也许你想使用set1.retainal(set2)?但它返回布尔。。。帮助?@ERJAN您必须将番石榴库添加到您的项目中才能使其生效。@真实性,谢谢,您没有“集合”的示例。现在生效-我已经测试过了。这是最好的答案!