如果字间距和大小写无关紧要,比较两个字符串-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来比较这两个字符串