[问题] 使用stream 跟 for loop 印出来不一样 ?

楼主: ntpuisbest (阿龙)   2022-04-28 00:10:04
※状况概述: 最近在练习leetcode 的 removeElement
发现使用stream api 和 使用for loop 去指定元素 答案会不一样?
使用steam api 在函数里面有正确改成功 但是 在main 里面就不一样了
有点难以叙述,请直接看code
※程式码:
public class LC0027RemoveElement {
public static int removeElement(int[] nums, int val) {
List<Integer> intList = new ArrayList<Integer>(nums.length);
int count=0;
int length=nums.length;
for (int i : nums){
if(i==val) {
count++;
}
}
System.out.println("length: "+nums.length);
System.out.println("count: "+count);
for (int i : nums){
intList.add(i);
}
System.out.println("size: " + intList.size() );
intList.removeAll(Arrays.asList(val));
nums = intList.stream().mapToInt(i -> i).toArray();
System.out.println("size: " + intList.size() );
// for(int i=0;i< intList.size();i++) {
// nums[i]=intList.get(i);
// }
System.out.println("nums in function:"+ Arrays.toString(nums)
return length-count;
}
public static void main(String[] args) {
int [] nums= { 3, 1, 2, 3, 2 };
int val=3;
int answer;
answer=removeElement(nums ,val);
System.out.println(answer);
System.out.println("print nums in main "+ Arrays.toString(num
s)
}
}
结果如下:
注解掉for loop的版本
https://imgur.com/YlOHT1Y
没有注解调for loop的版本
https://imgur.com/mVzZBtl
我的思路是 先将 nums这个阵列里面的值都copy 到 arraylist里面
然后利用arraylist里面的方法将 val 都移除掉
移除完之后再产生 nums = intList.stream().mapToInt(i -> i).toArray();
问题是 nums在函数里面是有被更改的 为何在main里面没有被更改 ??
令人疑惑的另外一件事情是
如果将我注解的for loop 拿掉
这样函数里面印出来的 跟 main 里面去印 nums 都会一致
有点搞不太懂理由是为何
作者: mikemike1021 (mike)   2022-04-28 04:57:00
没有注解掉 for-loop 的还有那段 nums = ... map 那段吗? 如果没有的话,那函式内是有改掉的,但只有改掉前三个值,但 nums 本身长度没有被改int [] nums 传进函式的只是阵列位置的,nums = ...map 那段把位置换掉而已,并没有更改到外面的,但是main nums 指的位置还是原先那块,所以外面的不会变。
作者: lycantrope (阿宽)   2022-04-28 09:19:00
传入func的是nums位置,nums[i]是将数值放入指定位置但map则是产生新的地址命名为nums,原始的nums不会变
作者: ssccg (23)   2022-04-28 12:33:00
nums = intList.stream().mapToInt(i -> i).toArray();是产生新的Array,将reference存到nums这个变量当然就不是原本nums指到的Array跟for相等的写法是 IntStream.range(0, intList.size()).forEach(i -> nums[i]=intList.get(i));另外你想做个移除元素的方法,但是阵列长度根本不能改,选用这个容器你从很基本的地方就错了
作者: gasbomb (虚空雷神兽)   2022-04-28 23:47:00
题目贴上来看看 没头没尾的看不懂你的问题啊 看到了 是leetcode第27题 这题你要做的是把指定的元素移到array的最后 也就是[3,1,2,3,2]变成[1,2,2,3,3]才对同学题目不要只看1/4啊 第二段有说不能改阵列长度的语言(就是java)要用交换的 然后第四段有说不能够宣告新的阵列
作者: fgh81113 (阿景)   2022-04-30 23:39:00
可能是jdk问题吧 https://imgur.com/oA73a4M这个是没注解的版本你可以用debug模式一步一步看结果阿
楼主: ntpuisbest (阿龙)   2022-05-04 10:53:00
我的jdk好像真的有些问题跟leetcode不一样,不过找不太到出在哪哈哈

Links booklink

Contact Us: admin [ a t ] ucptt.com