for循环创建一个比预期值少一个的数组

时间:2016-09-20 07:51:09

标签: java android arrays list

我确信这是非常简单的事情,但我现在还没能弄清楚现在发生了什么。

我有一个来自共享偏好的列表:

// 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循环中有很多文本,但我看不出有任何减少的原因。

3 个答案:

答案 0 :(得分:4)

for (int i = 0; i < alarmObjectsArray.size(); ++i/*I'm an old-fashioned cat*/){将索引数组中的每个元素。 (i将从0开始,并在包含小于数组大小的值1处完成并包含。)

放弃-1术语。

为避免疑义,Java数组从零开始。 Java你知道Fortran。

最后,< size()比同等<= size() - 1更惯用。如果size() - 1是一个无符号类型,那么另外size()可以在C ++中产生纯粹的恶魔 - 通常是 - 并且碰巧是零!

答案 1 :(得分:2)

让我们分析一下这段代码:

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 < sizei <= size-1,否则您将丢失一个项目。

希望你理解解释。

答案 2 :(得分: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个单元格。 &#39;重新0-indexed所以索引从0开始。它导致最后一个单元的索引为array.size() - 1。因此,如果要遍历所有索引,则必须从0循环到array.size()-1