如何解决为什么我的ArrayList无法正确删除?
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;
}
删除方法不起作用。输入“ aaabccddd”的输出即将到来的“ abcd”
解决方法
使用ArrayList,当您删除(i)时,所有其他索引都将移动。 因此,如果您删除索引0处的字符(对于“ aaabccddd”,则删除第一个'a'),则ArrayList变为“ [a,a,b,c,c,d,d,d]”。现在删除1处的char,它是第二个'a',并且ArrayList现在为“ [a,b,c,c,d,d,d]” ...
remove()方法运行正常,但是索引正在生成您的错误。
要解决此问题,请尝试:
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<ch.size(); i++)
{
ch.remove(i);
}
您要增加'i'并删除一个字符,以便解释您所看到的内容,您需要做的是用此代码替换remove for循环,该操作不会增加i并始终删除第一个字符
for(int i=0; i<ch.size();)
{
ch.remove(i);
}
,
问题是您要删除循环中的元素:
for(int i=0; i<ch.size(); i++)
{
ch.remove(i);
}
如果我使用示例"abc"
:
在第一轮中,ch.size() = 3
和i = 0
有{'a','b','c'}
所以您删除'a'
第二轮出了问题,因为i = 1
和ch.size() = 2
并且您有{'b','c'}
所以您删除'c'
在第三轮比赛中,它停止,因为您有i = 2 > ch.size() = 1
如果您要删除所有列表,则可以使用ch.clear()
删除所有元素。如果您真的想在循环中执行此操作,则可以使用:
int size = ch.size();
for(int i=0; i < size; i++)
{
ch.remove(0);
}
,
注意-,如果您从ArrayList中删除具有其索引的任何元素,则将新索引分配给该ArrayList的所有元素-
您可以使用while循环从ArrayList中删除所有元素-
while(ch.size() > 0){
ch.remove(0);
}
这是您修改的代码-
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);
}
}
,
您确定您正确理解自己的作业吗?
超级减少字符串“ aaabccddd”应导致“ abd”,而不是空字符串。
示例:
aaabccddd→abccddd→abddd→abd
在Java中,这可能是有效的实现:
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。