Java 初学者,比较嵌套for循环中的字符串
Java Beginner, comparing strings in nested for loop
这里是问题陈述:编写一个函数,将 2 个字符串与 return 真或假进行比较,具体取决于两个字符串是否包含相同的字母。顺序无关紧要。
我不知道如何正确比较嵌套 for 循环中的字符数组。我希望我能更具体地说明我的问题是什么,但我是一个真正的新手,不明白为什么这不起作用。我确实相信它没有在嵌套的 for 循环中做我想做的事情。提前致谢!
import java.util.Scanner;
public class PracticeProblems {
public static boolean stringCompare(String word1, String word2) {
char[] word1b = new char[word1.length()];
char[] word2b = new char[word2.length()];
boolean compareBool = false;
for(int i = 0; i < word1.length(); i++) {
word1b[i] = word1.charAt(i);
word2b[i] = word2.charAt(i);
}
for(int i = 0; i < word1.length(); i++) {
for(int j = 0; j < word2.length(); j++) {
if(word1b[i] == word2b[j]) {
compareBool = true;
break;
} else {
compareBool = false;
break;
}
}
}
return compareBool;
}
public static void main(String []args) {
Scanner scan = new Scanner(System.in);
System.out.println("Word 1?");
String word1 = scan.nextLine();
System.out.println("Word 2?");
String word2 = scan.nextLine();
if(PracticeProblems.stringCompare(word1, word2) == true) {
System.out.println("Same Letters!");
} else {
System.out.println("Different Letters...");
}
}
下面的代码可以完成这项工作。这实质上是对弗兰克上述评论的扩展。我们将两个字符串转换成两个集合,然后进行比较。
import java.util.*;
public class SameChars {
// Logic to convert the string to a set
public static Set<Character> stringToCharSet(String str) {
Set<Character> charSet = new HashSet<Character>();
char arrayChar[] = str.toCharArray();
for (char aChar : arrayChar) {
charSet.add(aChar);
}
return charSet;
}
// Compares the two sets
public static boolean hasSameChars(String str1, String str2) {
return stringToCharSet(str1).equals(stringToCharSet(str2));
}
public static void main(String args[]){
// Should return true
System.out.println(hasSameChars("hello", "olleh"));
// Should returns false
System.out.println(hasSameChars("hellox", "olleh"));
}
}
请允许我将您的 boolean
变量重命名为 letterFound
(或者甚至 letterFoundInWord2
),因为这是您在双循环中检查的内容。解释性命名更容易保持思路清晰。
因为你一次检查来自 word1
的一个字母,你可以将 letterFound
的声明移到外部 for
循环中并将其初始化为 false
在这里,因为每次你从 word1
拿一封新信,你还没有在 word2
中找到它。在 for
循环内的 if
语句中,如果字母相同并且您将 letterFound
设置为 true,则 break
是正确的。反之则不破,继续查下一个字母即可。事实上,您可以完全删除 else
部分。
内部for
循环后,如果letterFound
仍然不是true
,我们就知道word1
的字母不在word2
中。所以 stringCompare()
应该 return false:
if (! letterFound) {
return false;
}
通过此更改,在外部 for
循环之后我们知道来自 word1
的所有字母都 在 word2
中找到,因此您可以在这里输入return true;
。
除了:
- 您似乎假设字符串的长度相同。如果没有,您的程序将无法正常工作。
- 正如 Andy Turner 所说,您还应该检查
word2
中的所有字母是否都在 word1
中;它不是来自 word1
的字母在 word2
. 中
- 应该只考虑字母吗?您应该忽略空格、数字、标点符号……吗?
希望你能弄明白。欢迎随时跟进评论或提出新问题。
我在比较之前对数组进行了排序。
//import statement for Arrays class
import java.util.Arrays;
import java.util.Scanner;
public class PracticeProblems {
public static boolean stringCompare(String word1, String word2) {
char[] word1b = new char[word1.length()];
char[] word2b = new char[word2.length()];
boolean compareBool = true;
for(int i = 0; i < word1.length(); i++) {
word1b[i] = word1.charAt(i);
}
//sort the new char array
Arrays.sort(word1b);
// added a second loop to for the second world
for(int i = 0; i < word2.length(); i++) {
word2b[i] = word2.charAt(i);
}
Arrays.sort(word2b);
for(int i = 0; i < word1.length(); i++) {
//removed second for loop.
// for(int j = 0; j < word2.length(); j++) {
// if the two strings have different length, then they are different
if((word1.length()!=word2.length())){
compareBool = false;
break;
}
//changed to not equal
if( (word1b[i] != word2b[i]) ) {
compareBool = false;
break;
}
//removed else statment
// else {
// compareBool = false;
// break;
//
// }
}
return compareBool;
}
public static void main(String []args) {
Scanner scan = new Scanner(System.in);
System.out.println("Word 1?");
String word1 = scan.nextLine();
System.out.println("Word 2?");
String word2 = scan.nextLine();
if(PracticeProblems.stringCompare(word1, word2) == true) {
System.out.println("Same Letters!");
} else {
System.out.println("Different Letters...");
}
//resource leak. use close() method.
scan.close();
}
}
这里是问题陈述:编写一个函数,将 2 个字符串与 return 真或假进行比较,具体取决于两个字符串是否包含相同的字母。顺序无关紧要。
我不知道如何正确比较嵌套 for 循环中的字符数组。我希望我能更具体地说明我的问题是什么,但我是一个真正的新手,不明白为什么这不起作用。我确实相信它没有在嵌套的 for 循环中做我想做的事情。提前致谢!
import java.util.Scanner;
public class PracticeProblems {
public static boolean stringCompare(String word1, String word2) {
char[] word1b = new char[word1.length()];
char[] word2b = new char[word2.length()];
boolean compareBool = false;
for(int i = 0; i < word1.length(); i++) {
word1b[i] = word1.charAt(i);
word2b[i] = word2.charAt(i);
}
for(int i = 0; i < word1.length(); i++) {
for(int j = 0; j < word2.length(); j++) {
if(word1b[i] == word2b[j]) {
compareBool = true;
break;
} else {
compareBool = false;
break;
}
}
}
return compareBool;
}
public static void main(String []args) {
Scanner scan = new Scanner(System.in);
System.out.println("Word 1?");
String word1 = scan.nextLine();
System.out.println("Word 2?");
String word2 = scan.nextLine();
if(PracticeProblems.stringCompare(word1, word2) == true) {
System.out.println("Same Letters!");
} else {
System.out.println("Different Letters...");
}
}
下面的代码可以完成这项工作。这实质上是对弗兰克上述评论的扩展。我们将两个字符串转换成两个集合,然后进行比较。
import java.util.*;
public class SameChars {
// Logic to convert the string to a set
public static Set<Character> stringToCharSet(String str) {
Set<Character> charSet = new HashSet<Character>();
char arrayChar[] = str.toCharArray();
for (char aChar : arrayChar) {
charSet.add(aChar);
}
return charSet;
}
// Compares the two sets
public static boolean hasSameChars(String str1, String str2) {
return stringToCharSet(str1).equals(stringToCharSet(str2));
}
public static void main(String args[]){
// Should return true
System.out.println(hasSameChars("hello", "olleh"));
// Should returns false
System.out.println(hasSameChars("hellox", "olleh"));
}
}
请允许我将您的 boolean
变量重命名为 letterFound
(或者甚至 letterFoundInWord2
),因为这是您在双循环中检查的内容。解释性命名更容易保持思路清晰。
因为你一次检查来自 word1
的一个字母,你可以将 letterFound
的声明移到外部 for
循环中并将其初始化为 false
在这里,因为每次你从 word1
拿一封新信,你还没有在 word2
中找到它。在 for
循环内的 if
语句中,如果字母相同并且您将 letterFound
设置为 true,则 break
是正确的。反之则不破,继续查下一个字母即可。事实上,您可以完全删除 else
部分。
内部for
循环后,如果letterFound
仍然不是true
,我们就知道word1
的字母不在word2
中。所以 stringCompare()
应该 return false:
if (! letterFound) {
return false;
}
通过此更改,在外部 for
循环之后我们知道来自 word1
的所有字母都 在 word2
中找到,因此您可以在这里输入return true;
。
除了:
- 您似乎假设字符串的长度相同。如果没有,您的程序将无法正常工作。
- 正如 Andy Turner 所说,您还应该检查
word2
中的所有字母是否都在word1
中;它不是来自word1
的字母在word2
. 中
- 应该只考虑字母吗?您应该忽略空格、数字、标点符号……吗?
希望你能弄明白。欢迎随时跟进评论或提出新问题。
我在比较之前对数组进行了排序。
//import statement for Arrays class
import java.util.Arrays;
import java.util.Scanner;
public class PracticeProblems {
public static boolean stringCompare(String word1, String word2) {
char[] word1b = new char[word1.length()];
char[] word2b = new char[word2.length()];
boolean compareBool = true;
for(int i = 0; i < word1.length(); i++) {
word1b[i] = word1.charAt(i);
}
//sort the new char array
Arrays.sort(word1b);
// added a second loop to for the second world
for(int i = 0; i < word2.length(); i++) {
word2b[i] = word2.charAt(i);
}
Arrays.sort(word2b);
for(int i = 0; i < word1.length(); i++) {
//removed second for loop.
// for(int j = 0; j < word2.length(); j++) {
// if the two strings have different length, then they are different
if((word1.length()!=word2.length())){
compareBool = false;
break;
}
//changed to not equal
if( (word1b[i] != word2b[i]) ) {
compareBool = false;
break;
}
//removed else statment
// else {
// compareBool = false;
// break;
//
// }
}
return compareBool;
}
public static void main(String []args) {
Scanner scan = new Scanner(System.in);
System.out.println("Word 1?");
String word1 = scan.nextLine();
System.out.println("Word 2?");
String word2 = scan.nextLine();
if(PracticeProblems.stringCompare(word1, word2) == true) {
System.out.println("Same Letters!");
} else {
System.out.println("Different Letters...");
}
//resource leak. use close() method.
scan.close();
}
}