Java 为什么我的ArrayList没有正确删除? 静态字符串superReducedString(字符串s){ ArrayList ch=新的ArrayList(); 对于使用ArrayList的(int i=0;i
),当您删除(i)时,所有其他索引都将移位。 因此,如果删除索引0处的字符(对于“aaabccddd”,删除第一个“a”),ArrayList将变成“[a,a,b,c,c,d,d]”。现在删除索引1处的字符,它是第二个“a”,ArrayList现在是“[a,b,c,c,d,d,d]” remove()方法工作正常,但索引正在生成错误 要解决此问题,请尝试:Java 为什么我的ArrayList没有正确删除? 静态字符串superReducedString(字符串s){ ArrayList ch=新的ArrayList(); 对于使用ArrayList的(int i=0;i,java,arraylist,remove,Java,Arraylist,Remove,),当您删除(i)时,所有其他索引都将移位。 因此,如果删除索引0处的字符(对于“aaabccddd”,删除第一个“a”),ArrayList将变成“[a,a,b,c,c,d,d]”。现在删除索引1处的字符,它是第二个“a”,ArrayList现在是“[a,b,c,c,d,d,d]” remove()方法工作正常,但索引正在生成错误 要解决此问题,请尝试: static String superReducedString(String s) { ArrayList<Charact
static String superReducedString(String s) {
ArrayList<Character> ch = new ArrayList<Character>();
for(int i=0; i<s.length(); i++)
{
ch.add(s.charAt(i));
}
for(int i=0; i<ch.size(); i++)
{
ch.remove(i);
}
String finalarray="";
for(int i=0; i<ch.size(); i++)
{
finalarray=finalarray+ ch.get(i);
}
return finalarray;
}
静态字符串superReducedString(字符串s){
ArrayList ch=新的ArrayList();
对于(int i=0;i=0;i--)
{
ch.删除(i);
}
字符串finalarray=“”;
对于(int i=0;i而言,问题与此代码有关:
static String superReducedString(String s) {
ArrayList<Character> ch = new ArrayList<Character>();
for(int i=0; i<s.length(); i++)
{
ch.add(s.charAt(i));
}
for(int i=ch.size()-1; i>=0; i--)
{
ch.remove(i);
}
String finalarray="";
for(int i=0; i<ch.size(); i++)
{
finalarray=finalarray+ ch.get(i);
}
return finalarray;
}
}
for(int i=0;i问题在于您正在删除循环中的元素:
for(int i=0; i<ch.size();)
{
ch.remove(i);
}
注意-如果从ArrayList及其索引中删除任何元素,则会为该ArrayList的所有元素指定一个新索引-
int size = ch.size();
for(int i=0; i < size; i++)
{
ch.remove(0);
}
可以使用while循环从ArrayList中删除所有元素-
int size = ch.size();
for(int i=0; i < size; i++)
{
ch.remove(0);
}
这是你修改过的代码-
while(ch.size() > 0){
ch.remove(0);
}
package算法;
导入java.util.ArrayList;
公共类堆垛机{
公共静态void main(字符串[]args){
字符串s=“aaabccddd”;
ArrayList ch=新的ArrayList();
对于(int i=0;i 0){
ch.remove(0);
}
字符串finalarray=“”;
对于(int i=0;i你确定你正确理解了你的作业吗
超级减少字符串“aaabccddd”应导致“abd”,而不是空字符串
例如:
aaabccddd→ abccddd→ 阿布德→ 阿布德
在Java中,这可能是一个有效的实现:
package algo;
import java.util.ArrayList;
public class stackover {
public static void main(String[] args) {
String s = "aaabccddd";
ArrayList<Character> ch = new ArrayList<Character>();
for(int i=0; i<s.length(); i++)
{
ch.add(s.charAt(i));
}
while(ch.size() > 0){
ch.remove(0);
}
String finalarray="";
for(int i=0; i<ch.size(); i++)
{
finalarray=finalarray+ ch.get(i);
}
System.out.println(finalarray);
}
}
静态字符串superReducedString(字符串s){
String result=“空字符串”;
堆栈=新堆栈();
对于(int i=0;i
Define“not working”。您是遇到了一些错误还是仅仅得到了不想要的输出?如果是第二个选项,请提供输入、期望的输出以及您现在得到的结果。不想要的输出。对于输入“aaabccddd”,输出为“abcd”你期望的输出是什么?预期的输出是空字符串,修改你正在迭代的对象会导致奇怪的行为。考虑到代码< > 在第二个for循环中会不断增加。首先删除第一个字符(第二个字符变成第一个字符),然后删除第二个字符(前第三个)。,保留第一个字符不变,并继续删除数组中的字符。我对迭代解释投了赞成票,但我发现您建议的解决方案比它应该的更复杂。如果OP必须使用for循环,这是完美的,但如果OP必须使用for循环,则我建议只为变量分配一个新的空列表,或者如果迭代需要使用迭代器逐个删除每个元素,或者使用while(ch.size()>0)
循环删除元素。您可能是对的,谢谢您的评论。我通常发现,在ArrayList中删除最后一个对象会更容易,不会打乱迭代……但您的建议是有效的,也更容易。
package algo;
import java.util.ArrayList;
public class stackover {
public static void main(String[] args) {
String s = "aaabccddd";
ArrayList<Character> ch = new ArrayList<Character>();
for(int i=0; i<s.length(); i++)
{
ch.add(s.charAt(i));
}
while(ch.size() > 0){
ch.remove(0);
}
String finalarray="";
for(int i=0; i<ch.size(); i++)
{
finalarray=finalarray+ ch.get(i);
}
System.out.println(finalarray);
}
}
static String superReducedString(String s) {
String result = "Empty String";
Stack<Character> stack = new Stack();
for (int i = 0; i < s.length(); ++i) {
if (!stack.isEmpty() && stack.peek() == s.charAt(i)) {
stack.pop();
}
else {
stack.push(s.charAt(i));
}
}
if (!stack.isEmpty()) {
StringBuffer builder = new StringBuffer();
for (char c: stack) {
builder.append(c);
}
result = builder.toString();
}
return result;
}