如果字间距和大小写无关紧要,比较两个字符串-Java
Comparing two Strings if word spacing and capitalization do not matter-Java
我想做的是创建一个将两个对象作为输入的方法
字符串类型。如果两个字符串相同(字间距和大小写无关紧要),该方法将 return 逻辑真值。我想拆分字符串,制作一个元素数组,将每个元素添加到列表中,然后将每个元素与 space 进行比较并将其从列表中删除。最后使用 compareToIgnoreCase() 方法。我停止从 string2 的列表中删除 space。它适用于 string1List 而不适用于 string2List,我想知道为什么? :(
我会很感激你的帮助,我花了很多时间在这上面,但我被卡住了。也许有人知道更好的解决方案。
import java.util.ArrayList;
import java.util.List;
public class Strings {
public static void main(String[] args) {
String string1 = "This is a first string";
String string2 = "this is a first string";
String[] arrayOfString1 = string1.split("");
List<String> string1List = new ArrayList<>();
for (int i = 0; i < arrayOfString1.length; ++i) {
string1List.add(arrayOfString1[0 + i]);
}
String[] arrayOfString2 = string2.split("");
List<String> string2List = new ArrayList<>();
for (int i = 0; i < arrayOfString2.length; ++i) {
string2List.add(arrayOfString2[0 + i]);
}
for (int i = 0; i < string1List.size(); ++i) {
String character = string1List.get(0 + i);
if (character.equals(" ")) {
string1List.remove(character);
}
}
for (int i = 0; i < string2List.size(); ++i) {
String character = string2List.get(0 + i);
if (character.equals(" ")) {
string2List.remove(character);
}
}
System.out.println(string2List.size());
}
}
您可以尝试以下解决方案。正如你提到的字间距和大小写无关紧要
1.remove 大写 - 使用 toLowercase()
2.for 字间距 - 使用带有正则表达式模式 "\s+"
的 removeAll() 删除所有字间距,以便删除所有空格。
3. 现在检查两个字符串。
public class StringChecker {
public static void main(String[] args) {
System.out.println(checkString("This is a first string", "this is a first string"));
}
public static boolean checkString(String string1, String string2){
String processedStr1 = string1.toLowerCase().replaceAll("\s+", "");
String processedStr2 = string2.toLowerCase().replaceAll("\s+", "");
System.out.println(" s1 : " + processedStr1);
System.out.println(" s2 : " + processedStr2);
return processedStr1.equals(processedStr2);
}
}
您的问题与空格无关。您可以将它们替换为任何其他字符(例如“a”)以对此进行测试。因此,在上面给出的任何方法中删除空格都不会改进您的代码。
问题的根源在于使用 for 命令迭代列表。当您在 for 循环内从列表中删除一个项目时,删除 i-th 元素后,列表中的下一个元素成为 i-th 当前元素。
在循环的下一次重复中 - 当 i 递增 1 - 当前 i + 1 项成为列表中的下一项,因此您“丢失”(至少)一项。因此,用 for 命令遍历列表是个坏主意。
然而,您可以使用许多其他可用于集合的方法 - 例如迭代器 - 并且您的程序将运行良好。
Iterator <String> it = string1List.iterator();
while(it.hasNext())
{
if(it.next().equals("a")) it.remove();
}
当然完全没有必要用Lists来比较这两个字符串
我想做的是创建一个将两个对象作为输入的方法 字符串类型。如果两个字符串相同(字间距和大小写无关紧要),该方法将 return 逻辑真值。我想拆分字符串,制作一个元素数组,将每个元素添加到列表中,然后将每个元素与 space 进行比较并将其从列表中删除。最后使用 compareToIgnoreCase() 方法。我停止从 string2 的列表中删除 space。它适用于 string1List 而不适用于 string2List,我想知道为什么? :(
我会很感激你的帮助,我花了很多时间在这上面,但我被卡住了。也许有人知道更好的解决方案。
import java.util.ArrayList;
import java.util.List;
public class Strings {
public static void main(String[] args) {
String string1 = "This is a first string";
String string2 = "this is a first string";
String[] arrayOfString1 = string1.split("");
List<String> string1List = new ArrayList<>();
for (int i = 0; i < arrayOfString1.length; ++i) {
string1List.add(arrayOfString1[0 + i]);
}
String[] arrayOfString2 = string2.split("");
List<String> string2List = new ArrayList<>();
for (int i = 0; i < arrayOfString2.length; ++i) {
string2List.add(arrayOfString2[0 + i]);
}
for (int i = 0; i < string1List.size(); ++i) {
String character = string1List.get(0 + i);
if (character.equals(" ")) {
string1List.remove(character);
}
}
for (int i = 0; i < string2List.size(); ++i) {
String character = string2List.get(0 + i);
if (character.equals(" ")) {
string2List.remove(character);
}
}
System.out.println(string2List.size());
}
}
您可以尝试以下解决方案。正如你提到的字间距和大小写无关紧要
1.remove 大写 - 使用 toLowercase()
2.for 字间距 - 使用带有正则表达式模式 "\s+"
的 removeAll() 删除所有字间距,以便删除所有空格。
3. 现在检查两个字符串。
public class StringChecker {
public static void main(String[] args) {
System.out.println(checkString("This is a first string", "this is a first string"));
}
public static boolean checkString(String string1, String string2){
String processedStr1 = string1.toLowerCase().replaceAll("\s+", "");
String processedStr2 = string2.toLowerCase().replaceAll("\s+", "");
System.out.println(" s1 : " + processedStr1);
System.out.println(" s2 : " + processedStr2);
return processedStr1.equals(processedStr2);
}
}
您的问题与空格无关。您可以将它们替换为任何其他字符(例如“a”)以对此进行测试。因此,在上面给出的任何方法中删除空格都不会改进您的代码。
问题的根源在于使用 for 命令迭代列表。当您在 for 循环内从列表中删除一个项目时,删除 i-th 元素后,列表中的下一个元素成为 i-th 当前元素。
在循环的下一次重复中 - 当 i 递增 1 - 当前 i + 1 项成为列表中的下一项,因此您“丢失”(至少)一项。因此,用 for 命令遍历列表是个坏主意。
然而,您可以使用许多其他可用于集合的方法 - 例如迭代器 - 并且您的程序将运行良好。
Iterator <String> it = string1List.iterator();
while(it.hasNext())
{
if(it.next().equals("a")) it.remove();
}
当然完全没有必要用Lists来比较这两个字符串