[問題] 使用stream 跟 for loop 印出來不一樣 ?

看板java作者 (阿龍)時間2年前 (2022/04/28 00:10), 2年前編輯推噓1(1025)
留言26則, 6人參與, 2年前最新討論串1/1
※狀況概述: 最近在練習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
沒有註解掉 for-loop 的還有那段 nums = ... map 那
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
改掉前三個值,但 nums 本身長度沒有被改
04/28 04:57, 3F

04/28 05:04, 2年前 , 4F
int [] nums 傳進函式的只是陣列位置的,nums = ...
04/28 05:04, 4F

04/28 05:04, 2年前 , 5F
map 那段把位置換掉而已,並沒有更改到外面的,但是
04/28 05:04, 5F

04/28 05:04, 2年前 , 6F
main nums 指的位置還是原先那塊,所以外面的不會
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
傳入func的是nums位置,nums[i]是將數值放入指定位置
04/28 09:19, 8F

04/28 09:20, 2年前 , 9F
但map則是產生新的地址命名為nums,原始的nums不會變
04/28 09:20, 9F

04/28 12:33, 2年前 , 10F
nums = intList.stream().mapToInt(i -> i).toArray();
04/28 12:33, 10F

04/28 12:34, 2年前 , 11F
是產生新的Array,將reference存到nums這個變數
04/28 12:34, 11F

04/28 12:35, 2年前 , 12F
當然就不是原本nums指到的Array
04/28 12:35, 12F

04/28 12:40, 2年前 , 13F
跟for相等的寫法是 IntStream.range(0, intList.size())
04/28 12:40, 13F

04/28 12:45, 2年前 , 14F
.forEach(i -> nums[i]=intList.get(i));
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
啊 看到了 是leetcode第27題 這題你要做的是把指定的元素
04/28 23:50, 18F

04/28 23:53, 2年前 , 19F
移到array的最後 也就是[3,1,2,3,2]變成[1,2,2,3,3]才對
04/28 23:53, 19F

04/29 00:09, 2年前 , 20F
同學題目不要只看1/4啊 第二段有說不能改陣列長度的語言(
04/29 00:09, 20F

04/29 00:09, 2年前 , 21F
就是java)要用交換的 然後第四段有說不能夠宣告新的陣列
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
可能是jdk問題吧 https://imgur.com/oA73a4M
04/30 23:39, 22F

04/30 23:40, 2年前 , 23F
這個是沒註解的版本
04/30 23:40, 23F

04/30 23:42, 2年前 , 24F
你可以用debug模式一步一步看結果阿
04/30 23:42, 24F

05/04 10:53, 2年前 , 25F
我的jdk好像真的有些問題跟leetcode不一樣,不過找不
05/04 10:53, 25F

05/04 10:53, 2年前 , 26F
太到出在哪哈哈
05/04 10:53, 26F
文章代碼(AID): #1YQMhU7M (java)
文章代碼(AID): #1YQMhU7M (java)