String 如何在Java中创建更优雅的函数,从两个字符串中获得相等的字母?
我在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
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您必须将番石榴库添加到您的项目中才能使其生效。@真实性,谢谢,您没有“集合”的示例。现在生效-我已经测试过了。这是最好的答案!