读书人

哪位高手能帮帮小弟我!ArrayList

发布时间: 2012-01-05 22:36:54 作者: rapoo

谁能帮帮我!!ArrayList!

import java.util.*;
import java.text.*;

public class PubMet{
String PubMethod;
public PubMet()
{
}

public static int JudgeMet2(String UserPub,String CoPub)
{
List UP = new ArrayList();
for(StringTokenizer UParr=new StringTokenizer(UserPub, ", ");UParr.hasMoreTokens();)
{
UP.add(UParr.nextToken());
}
String CP=CoPub;

for(int ii=0;ii <UP.size();ii++)
{
if (CP.indexOf(UP.get(ii).toString())!=-1)
{
return(0);
}
}
return(1);
}


public static ArrayList JudgeMet4(String UserPub)
{
List UP = new ArrayList();
for(StringTokenizer UParr=new StringTokenizer(UserPub, ", ");UParr.hasMoreTokens();)
{
UP.add(UParr.nextToken());
}
ArrayList CoPub=new ArrayList();
ArrayList pub1=new ArrayList();
pub1.add( "A ");
pub1.add( "B ");
ArrayList pub2=new ArrayList();
pub2.add( "C ");
pub2.add( "D ");
ArrayList pub3=new ArrayList();
pub3.add( "E ");
pub3.add( "F ");
ArrayList pub4=new ArrayList();
pub4.add( "G ");
pub4.add( "H ");
CoPub.add(pub1);
CoPub.add(pub2);
CoPub.add(pub3);
CoPub.add(pub4);
for(int s=CoPub.size();--s> 0;)
{
for (int i=0;((List)CoPub.get(s)).size()> 0 && i <((List)CoPub.get(s)).size(); i++)
{
for(int ii=0;ii <UP.size();ii++)
{
if(UP.get(ii).equals(((List)CoPub.get(s)).get(i)))
{
CoPub.remove(s);
break;
}
}
}

}
return(CoPub);
}



public static void main(String[] args)
{
String test= "A,B,C,D, ";//用这个字符串测试能够通过
//String test= "A,B,C,D,E,F,G, ";//用这个字符串测试不能通过
ArrayList a=new ArrayList();
a=JudgeMet4(test);
System.out.println(a.size());
System.out.println(((List)a.get(0)).get(1));
}

}

------解决方案--------------------


既然解决了,我就不贴程序了。
问题的根源在于你对List的不正确使用,在遍历一个List的时候,不推荐删除的操作,因为一旦删除,List的size就变化了,这样作为下标的循环变量可能就会超过List的size,也就是越界了。所以如果要在遍历的时候删除元素,一定要注意下标的问题。
[解决办法]
1# for(int s=CoPub.size();--s> 0;){
2# for (int i=0;((List)CoPub.get(s)).size()> 0 && i <((List)CoPub.get(s)).size(); i++){
3# Test: //跳出循环到这里!
4# for(int ii=0;ii <UP.size();ii++) {
5# if(UP.get(ii).equals(((List)CoPub.get(s)).get(i))) {
6# CoPub.remove(s);
7# break Test;//以前少跳一级
8# }
9# }
10# }
11#}
分析:
2#有问题:
这个循环的初始条件i=0,终止条件CoPub.get(s).size()> 0&&i <CoPub.get(s).size()> 0
你在看看6#,每次发现相等的都要从CoPub删掉,也就是说CoPub的长度一直再变!
当你删掉后CoPub.get(s)不能保证能得到结果,也就是CoPub.size <s,这样就出现了错误!
你的测试1没出现CoPub.size <s单测试2的数据数现了这种情况!
改进方式:
单独创建一个List保存相同的元素,最后整体删除:
1#前加一句:ArrayList temp = new ArrayList();
6#改:temp.add(CoPub.get(s));
11#后加一句:CoPub.remove(temp);

这种改法只能保证程序没问题,不保证结果正确,
因为没看明白你的程序要做什么!~

读书人网 >J2SE开发

热点推荐