※狀況概述: 最近在練習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 都會一致
有點搞不太懂理由是為何