java 删除字符串中出现的字符

enxuqcxy  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(91)

在下面的代码中,我试图找到字符串“CACA”中出现的每个“C”,将其删除,然后将新生成的字符串添加到数组列表中。但是,每个出现的字符串都应该从原始字符串“CACA”中删除一次,并从每个新生成的字符串中删除一次。
因此,输出应如下所示:[中亚民航局、民航局、民航局、民航局]
我的代码返回:[CACA,ACA,AA],那么我错过了什么?

ArrayList<String> array = new ArrayList<String>();
        array.add("CACA");
        String s = "C";
        //ArrayList<String> newArray = new ArrayList<String>(); // create a new array to hold the new elements

        for(int i = 0; i < array.size(); i++) {
            for(int j = 0; j < array.get(i).length(); j++) {
                if(s.equals(String.valueOf(array.get(i).charAt(j)))) {
                    if(array.get(i).length() == 1) {
                        array.add("e");
                    } else {
                        String a = String.valueOf(array.get(i).charAt(j));
                        int index = array.get(i).indexOf(a);
                        if(index == 0) {
                            String newStr = array.get(i).substring(1);
                            array.add(newStr);
                        } else if(index == array.get(i).length() - 1) {
                            String newStr = array.get(i).substring(0, array.get(i).length() - 1);
                            array.add(newStr);
                        } else {
                            String newStr = array.get(i).substring(0, index) + array.get(i).substring(index + 1);
                            array.add(newStr);
                        }
                    }
                }
            }
        }
        //System.out.println(newArray);
        // add the new elements to the original array after the loop has finished
        //array.addAll(newArray);

        HashSet<String> setWithoutDuplicates = new HashSet<String>(array);
        array.clear();
        array.addAll(setWithoutDuplicates);
        System.out.print(array);
ee7vknir

ee7vknir1#

下面是您的代码的问题;
你从一个包含字符串“CACA”的数组列表开始,然后删除第一个“C”,并将新的字符串“ACA”添加到数组列表中两次

int index = array.get(i).indexOf(a);

此代码返回索引0两次,并导致数组列表中出现重复的字符串。
方法的作用是:返回指定字符在字符串中第一次出现的位置。
你的代码从来没有找到字符串中第二个“C”的索引,所以“CAA”没有被添加到数组列表中,上面的代码是不必要的,因为**你已经可以找到变量“j”中存储的字符的索引。
for循环在新添加的字符串“ACA”(两个字符串)上运行,中间的“C”被删除,“AA”被添加到列表中两次,过程结束。
这是解决方案:

ArrayList<String> array = new ArrayList<String>();
array.add("CACA");
String charToSearch = "C";

for(int i = 0; i < array.size(); i++) {
    for(int j = 0; j < array.get(i).length(); j++) {

        String currentCharAsString = String.valueOf(array.get(i).charAt(j));
        if(charToSearch.equals(currentCharAsString)) {
            if(array.get(i).length() == 1) {
                array.add("e");
            } else {
                String newString = array.get(i).substring(0, j) + array.get(i).substring(j + 1);
                //Check if the string is already added to the array list to prevent duplicates
                if(!array.contains(newString))
                    array.add(newString);

            }
        }
    }
}
System.out.print(array);
w1e3prcc

w1e3prcc2#

您的代码的问题是,它没有从原始字符串和每个新生成的字符串中删除所有出现的字符“C”。相反,它只删除在原始字符串中找到的第一个出现的“C”,然后生成新字符串。不会删除新字符串中后续出现的“C”。要解决此问题,你可以修改内部循环来跟踪从原始字符串中删除的最后一个“C”的索引,然后在每个新生成的字符串中只删除该索引之后的下一个“C”。
然而,值得注意的是,这种方法只适用于长度为1的字符串,而且不太灵活。最好编写更通用的代码,以处理任何字符串和字符。作为一种替代方法,我编写了一个函数,它完全符合您的要求:

public static ArrayList<String> deleteOccurrences(String input,char occ) {
    ArrayList<String> result = new ArrayList<>();
    result.add(input);
    for (int i = 0; i < result.size(); i++)
        for (int j = 0; j < result.get(i).length(); j++)
            if (result.get(i).charAt(j) == occ && !result.contains(result.get(i).substring(0, j) + result.get(i).substring(j + 1)))
                result.add(result.get(i).substring(0, j) + result.get(i).substring(j + 1));
    return result;
}

你可以像这样调用这个函数(如果你想测试它):

ArrayList<String> result = deleteOccurrences("CACA",'C');
 System.out.println(result);

相关问题