关于数组和List的转化问题

小弟我刚刚进入java,还是个新手,今天在网上遇到一个问题:给你一个数组(单个元素只小于14),如果其中某2个元素的和为14,那么就删除这2个元素,最后返回剩下的元素,例如给定数组9,9,5,13,7,1,那么最后返回的值是:9,7.我没事就试着尝试实现它。首先考虑到会有重复,而且还要删除某些元素,那么我想是不是可以将数组转化为List,结果网上一查,有Arrays.asList()这个方法将数组转换为List,而用ArrayList.toArray()转化list为数组。结果遇到了问题:
1.如果我传入的数组时null,但是转化为list之后,居然list是一个长度为1的列表,然后我打印该元素的toString方法,抛出异常了。这样解决的办法只能对输入的数组做一个判断了。
2.最后由List转化为数组的时候也有问题:我定义传入和返回值都是int数组,结果在ArrayList.toArray转化为数组的时候只能转化为对象类型的数组,而int是基本类型,无法转化,我想是不是先转化为Integer数组,再让Integer数组转化为int,但是想法是美好的,事实是残酷的,Integer无法转化为int,仔细一想,对象数组怎么能转化为基本类型的数组呢!还是不要偷懒了,直接用循环将list转化为int数组吧——这样ArrayList.toArray转化为int数组就是废了。
3.前面这2个问题都解决了,再执行该方法,还是有错误。出现了以下异常:java.lang.NumberFormatException,经过查找发现时将list转为int数组时候出问题,此时我打印该list的长度和元素的toString方法,出现了很大的意外:首先长度居然是1,我传入的数组的长度是7,;另外,toString的结果居然是一个hashcode码。此时也就解决了为什么转化的时候出异常的问题了,主要的是为什么list的长度会是1.这个时候我来测试这个方法,如果有String和Integer数组,此时转化为List正常,但是int就是转化后的长度为1,此时想到该转化的方法是以对象为单个元素的?由于String和Integer的单个元素都是对象,所有每个元素都转化成为了List的汇总的元素,而int数组每个元素不是对象,只有该数组本身才是对象,所以转化后的长度始终为1,这也就解释了1中的现象。
4.经过3中的考虑,我想,还是把输入输出值都变成Integer的数组吧!此时再写的时候方便了很多。但是还是出现了一个异常:java.lang.UnsupportedOperationException
经过查询,发现是在数组转化为List的时候,可能转化为List或ArrayList这2种,而List类型不能使用add和remove方法,而我转化为数组就是为了使用remove方法,此时必须要将List为ArrayList类型,那么就能解决该问题。

经过以上的编程过程,发现数组和List的转换还是有限制的,而且很麻烦,也容易出问题,而且在API上面对于注意的问题也没有说明,只是说明了可以相互转化。以下是该问题的代码,各位高手看看是否有无问题,以及能否对该代码进行修改,使之在性能和逻辑以及代码量上面做出提高。谢谢了!!!
public static Integer[] get14(Integer input[]){
if(input==null || input.length==0){
return input;
}else{
List list=Arrays.asList(input);
list=new ArrayList(list);
int i=0;
while(i!=list.size()){
boolean b=true;
for(int j=0;j<list.size();j++){
if(i!=j){
Integer x=(Integer)list.get(i);
Integer y=(Integer)list.get(j);
if((x+y)==14){ list.remove(i);
list.remove(j-1) b=false;
break;
}
}
}
if(b){
i++;
}
}
Integer output[] = (Integer[])list.toArray(new Integer[list.size()]);
return output;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值