[英]For loop creating an array with one less value than expected
我敢肯定這確實很簡單,但是我暫時無法弄清楚正在發生的事情。
我有一個從共享首選項中獲得的列表:
// Access the shared preferences to see if the user has saved any alarms yet
SharedPreferences sharedPreferences = context.getSharedPreferences("AppData", Context.MODE_PRIVATE);
String alarmsstring = sharedPreferences.getString("AlarmsStringSP", "None");
// Split the the main alarm string into array of strings values for alarm objects
List<String> alarmObjectsArray = Arrays.asList(alarmsstring.split("\\s*;\\s*"));
我使用以下方法檢查該列表的大小:
System.out.println("Testing"+ alarmObjectsArray.size());
我得到:
I/System.out: Testing3
我所期望的到那為止都很好。
然后,我創建一個新的數組列表,並將舊列表的每個元素放入轉換為對象的新列表中。
像這樣:
// Iterate through the alarm objects, and place each item into the alarms array
for (int i = 0; i < alarmObjectsArray.size()-1; i++){
// For each of the alarm objects split them into their induvidual items so they can be
// converted back to the correct type.
List<String> alarmItems = Arrays.asList(alarmObjectsArray.get(i).split("\\s*,\\s*"));
Alarm alarm = new Alarm(Integer.parseInt(alarmItems.get(0)),Integer.parseInt(alarmItems.get(1)),
Boolean.parseBoolean(alarmItems.get(2)), Boolean.parseBoolean(alarmItems.get(3)),
Boolean.parseBoolean(alarmItems.get(4)),Boolean.parseBoolean(alarmItems.get(5)),
Boolean.parseBoolean(alarmItems.get(6)), Boolean.parseBoolean(alarmItems.get(7)),
Boolean.parseBoolean(alarmItems.get(8)));
alarms.add(alarm);
}
唯一的事情是當它退出for循環時,我使用以下命令檢查新的數組大小:
System.out.println("Testing"+ alarms.size());
我得到:
I/System.out: Testing2
當它從列表中被帶入數組時,它以某種方式丟失了一個。 我知道for循環中有很多文本,但是我看不出有什么原因少了一些。
for (int i = 0; i < alarmObjectsArray.size(); ++i/*I'm an old-fashioned cat*/){
將在數組中的每個元素上進行索引。 ( i
將從0開始,到並包括一個小於數組大小的值)。
刪除-1項。
為避免疑問,Java數組從零開始 。 您知道Java不是Fortran。
最后, < size()
比等效的<= size() - 1
更習慣。 此外, size() - 1
如果size()
是無符號類型(通常是無符號類型size()
並且恰好為零,則size() - 1
可以在C ++中產生純粹的魔鬼現象!
讓我們分析一下這段代碼:
for (int i = 0; i < alarmObjectsArray.size()-1; i++)
for
表示循環內的代碼完成,直到條件成立為止。
正確設置后,第一個循環將以i = 0
運行。
自從您編寫i++
以來,每個循環都會為i
加1。
您的退出條件是i < size-1
。 由於size = 3
,這意味着i < 3-1
,等於i < 2
因此代碼將在i = 0和i = 1的情況下運行
這意味着代碼將僅運行2次。
在for循環中,如果要避免使用foreach
,請使用i < size
或i <= size-1
,否則將丟失一個項目。
希望您理解說明。
如我所見,您不一定了解for
循環,因此讓我們集中精力。
int[] array = new int[5];
System.out.println(array.size());
for (int i = 0; i < array.size(); i++) {
System.out.println(i);
}
上面的代碼將打印:
>5
>0
>1
>2
>3
>4
該陣列有5個單元。 The're 0-indexed
,因此指數從開始0
。 結果是最后一個單元格的索引為array.size() - 1
。 因此,如果要遍歷所有索引,則必須從0
到array.size()-1
進行循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.