[問題] 使用stream 跟 for loop 印出來不一樣 ?
※狀況概述: 最近在練習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 都會一致
有點搞不太懂理由是為何
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.139.177 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/java/M.1651075806.A.1D6.html
※ 編輯: ntpuisbest (118.160.139.177 臺灣), 04/28/2022 00:12:23
→
04/28 04:57,
2年前
, 1F
04/28 04:57, 1F
→
04/28 04:57,
2年前
, 2F
04/28 04:57, 2F
沒有註解掉for loop那段的,就沒有nums map那段
→
04/28 04:57,
2年前
, 3F
04/28 04:57, 3F
→
04/28 05:04,
2年前
, 4F
04/28 05:04, 4F
→
04/28 05:04,
2年前
, 5F
04/28 05:04, 5F
→
04/28 05:04,
2年前
, 6F
04/28 05:04, 6F
→
04/28 05:04,
2年前
, 7F
04/28 05:04, 7F
※ 編輯: ntpuisbest (36.227.32.51 臺灣), 04/28/2022 08:41:29
但是註解掉 map 沒有註解掉for loop版本的
為何函數內的nums跟 main的nums是一致的
就真的有改到nums呢
※ 編輯: ntpuisbest (36.227.32.51 臺灣), 04/28/2022 09:12:12
推
04/28 09:19,
2年前
, 8F
04/28 09:19, 8F
→
04/28 09:20,
2年前
, 9F
04/28 09:20, 9F
→
04/28 12:33,
2年前
, 10F
04/28 12:33, 10F
→
04/28 12:34,
2年前
, 11F
04/28 12:34, 11F
→
04/28 12:35,
2年前
, 12F
04/28 12:35, 12F
→
04/28 12:40,
2年前
, 13F
04/28 12:40, 13F
→
04/28 12:45,
2年前
, 14F
04/28 12:45, 14F
→
04/28 12:47,
2年前
, 15F
04/28 12:47, 15F
→
04/28 12:48,
2年前
, 16F
04/28 12:48, 16F
對,他說要做in place 但是我不會做移除的方法,所以才想說複製到arraylist裡面
待會再來貼貼看找到的解答
謝謝
※ 編輯: ntpuisbest (36.227.32.51 臺灣), 04/28/2022 13:55:48
https://i.imgur.com/X7cSRZE.jpg
對,陣列長度根本不能改
所以我發現他的所謂的移除
其實只是把他不要的元素
3
把它取代掉?
※ 編輯: ntpuisbest (101.12.113.5 臺灣), 04/28/2022 18:17:41
→
04/28 23:47,
2年前
, 17F
04/28 23:47, 17F
→
04/28 23:50,
2年前
, 18F
04/28 23:50, 18F
→
04/28 23:53,
2年前
, 19F
04/28 23:53, 19F
→
04/29 00:09,
2年前
, 20F
04/29 00:09, 20F
→
04/29 00:09,
2年前
, 21F
04/29 00:09, 21F
其實我的主要問題不是這題怎麼解,而是
標題的敘述,但還是感謝你回答,謝謝~
※ 編輯: ntpuisbest (101.12.113.5 臺灣), 04/29/2022 01:02:06
以前用Api習慣了,非常不擅長array的基本操作qq
※ 編輯: ntpuisbest (101.12.113.5 臺灣), 04/29/2022 01:03:14
目前就想說從leetcode explore 一題一題看,雖然平常後端開發很少用到,但總覺得不
能連基本的變數操作都有問題哀qq
※ 編輯: ntpuisbest (101.12.113.5 臺灣), 04/29/2022 01:04:29
→
04/30 23:39,
2年前
, 22F
04/30 23:39, 22F
→
04/30 23:40,
2年前
, 23F
04/30 23:40, 23F
→
04/30 23:42,
2年前
, 24F
04/30 23:42, 24F
→
05/04 10:53,
2年前
, 25F
05/04 10:53, 25F
→
05/04 10:53,
2年前
, 26F
05/04 10:53, 26F
java 近期熱門文章
PTT數位生活區 即時熱門文章