Curry_warrior 2019-03-30 16:41 采纳率: 50%
浏览 290
已结题

请教下以下代码为何运行出来达不到效果,自定义了一个list

我写了一串代码,首先自定义了一个E类型的list,然后写了如下方法,目的是想删除list里出现过三次大元素,代码如下:

public class ArraySubList<E> implements Cloneable {
private E[] data;
private int manyItems;
private String[] data2;


public ArraySubList()
{
final int INITIAL_CAPACITY = 10;
manyItems = 0;
data = (E[]) new Object[INITIAL_CAPACITY];
data2=new String[INITIAL_CAPACITY];
}


public ArraySubList(int initialCapacity){
if (initialCapacity < 0)
throw new IllegalArgumentException("The initialCapacity is negative: " + initialCapacity);
data=(E[])new Object[initialCapacity];
manyItems=0;
data2=new String[initialCapacity];
}


出问题的方法
public int removeItemAppearThree(){
int index;
int indexInner;
int indexStore[]=new int[3]; //储存出现过恰好3次元素的index
int targetCount[]={1,1,1,1,1,1,1,1}; //计算不同元素出现的次数,初始值为1
for(index=0;index<manyItems;index++){
for(indexInner=1;indexInner<manyItems;indexInner++){
if(data[index]==data[indexInner]){ //如果两个元素相等
targetCount[index]=targetCount[index]+1; //次数加1
if(targetCount[index]==2){ 
indexStore[0]=index;
indexStore[1]=indexInner;
}
else if(targetCount[index]==3){
indexStore[2]=indexInner;
}
}
}if(targetCount[index]==3){ //如果出现三次,则把三个元素删除,通过自减的方法
data[indexStore[0]] =data[manyItems--]; //manyItems是在list里的总个数
data[indexStore[1]] =data[manyItems--];
data[indexStore[2]] =data[manyItems--];
}
} 

return manyItems; //返回list还剩下的个数
}

测试代码:
public class ArraySubListTest {
public static void main(String[]args){
String[] a={"a","a","b","c","d","e","a","a","e"};
ArraySubList<String> sublist=new ArraySubList<>();
sublist.addMany(a);
System.out.println(sublist.removeItemAppearThree());
}
}

结果为6,但正确的应该是9,因为没有元素出现恰好三次,可是如果我把测试元素改为:
String[] a={"a","a","b","c","d","e","a","a"};即只有元素出现三次或一次,输出结果就正常了为8.
就是当一个元素出现了两次的时候,结果就会不如预期,这是为啥呢?

  • 写回答

3条回答 默认 最新

  • MGYH 2019-03-30 18:48
    关注

    错误在于最后一个,删除的不是a,而是e。你自己试着算把最后一个e带进去试试。可以用debug来弄。最后一个e进去,他初始值就是1了(你的targetCount[]有八个一,但我估计是你第二组测试用例的时候删的,不然会数组越界)。然后你的循环并不会跳过自己本身,所以遇到第一个e之后,他就是2了,在遇到自己就是3了,满足条件就删除了三次。

    评论

报告相同问题?

悬赏问题

  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区