[英]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.