在下面的代码中,我试图找到字符串“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);
2条答案
按热度按时间ee7vknir1#
下面是您的代码的问题;
你从一个包含字符串“CACA”的数组列表开始,然后删除第一个“C”,并将新的字符串“ACA”添加到数组列表中两次。
此代码返回索引0两次,并导致数组列表中出现重复的字符串。
方法的作用是:返回指定字符在字符串中第一次出现的位置。
你的代码从来没有找到字符串中第二个“C”的索引,所以“CAA”没有被添加到数组列表中,上面的代码是不必要的,因为**你已经可以找到变量“j”中存储的字符的索引。
for循环在新添加的字符串“ACA”(两个字符串)上运行,中间的“C”被删除,“AA”被添加到列表中两次,过程结束。
这是解决方案:
w1e3prcc2#
您的代码的问题是,它没有从原始字符串和每个新生成的字符串中删除所有出现的字符“C”。相反,它只删除在原始字符串中找到的第一个出现的“C”,然后生成新字符串。不会删除新字符串中后续出现的“C”。要解决此问题,你可以修改内部循环来跟踪从原始字符串中删除的最后一个“C”的索引,然后在每个新生成的字符串中只删除该索引之后的下一个“C”。
然而,值得注意的是,这种方法只适用于长度为1的字符串,而且不太灵活。最好编写更通用的代码,以处理任何字符串和字符。作为一种替代方法,我编写了一个函数,它完全符合您的要求:
你可以像这样调用这个函数(如果你想测试它):