【问题标题】:Comparing two Strings if word spacing and capitalization do not matter-Java如果单词间距和大小写无关紧要,则比较两个字符串-Java
【发布时间】:2022-01-22 11:58:49
【问题描述】:

我想做的是创建一个将两个对象作为输入的方法 字符串类型。如果两个字符串相同(字间距和大小写无关紧要),该方法将返回逻辑真值。我想拆分字符串,制作一个元素数组,将每个元素添加到列表中,然后将每个元素与空间进行比较并将其从列表中删除。最后使用 compareToIgnoreCase() 方法。我停止从 List 中删除 string2 的空间。它适用于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());
}

}

【问题讨论】:

  • “字间距 .. 无关紧要”是什么意思?你认为"a b c""a b c""abc" 是相等的字符串吗?
  • 是的,这是java老师的想法;/
  • 然后您可以简单地删除两个字符串中的所有空格(将它们替换为空)并比较其余字母而不区分大小写。类似str1.replace(" ","").equalsIgnoreCase(str2.replace(" ",""))

标签: java string list arraylist compareto


【解决方案1】:

您可以尝试以下解决方案。正如你提到的字间距和大小写无关紧要

1.删除大写 - 使用 toLowercase() 2.对于字间距 - 使用带有正则表达式模式"\\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);
    }
}

【讨论】:

  • 请注意,转换为小写并不总是有效。例如,大写的 sigma Σ 可能会转换为小写的 sigma σ,而不是小写的最终 sigma,ς。所以 Σ 和 ς 不会匹配,尽管它们应该匹配:Σσς 都是“字母 sigma”。有类似的转换为大写的例子。因此,如果“字母”可以是“A-Za-z”范围以外的任何内容,则首选 equalsIgnoreCase。
【解决方案2】:

您的问题与空格无关。您可以将它们替换为任何其他字符(例如“a”)来测试它。因此,在上面给出的任何方法中删除空格都不会改进您的代码。

问题的根源在于使用 for 命令迭代列表。当你从 for 循环内的列表中删除一个项目时,删除第 i 个元素后,列表中的下一个元素将成为第 i 个当前元素。

在循环的下一次重复中 - 当 i 加一时 - 当前 i + 1 项成为列表中的下一项,因此您“丢失”(至少)一项。因此,使用 for 命令遍历列表是个坏主意。

但是,您可以使用许多其他可用于集合的方法(例如迭代器),并且您的程序可以正常工作。

    Iterator <String> it = string1List.iterator();
    
    while(it.hasNext())
        
    {
        if(it.next().equals("a")) it.remove();
    }

当然完全不需要使用Lists来比较这两个字符串。

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 2017-09-04
    • 2019-04-27
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多