2016-09-20 3 views
0

Я уверен, что это что-то очень простое, но я не смог разобраться в том, что происходит какое-то время.Для цикла, создающего массив с одним меньшим значением, чем ожидалось

У меня есть список, я получаю от общего предпочтения:

// 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); 
    } 

Единственное, когда он выходит из за петли проверить новый размер массива с:

System.out.println("Testing"+ alarms.size()); 

И я получаю:

I/System.out: Testing2 

Как-то он потерял один, когда он был взят из списка в массив. Я знаю, что в цикле for есть много текста, но я не вижу никакой причины иметь меньше.

+1

возможно из-за 'alarmObjectsArray.size() - 1'? – Blackbelt

+1

'for (int i = 0; i Eran

+0

'alarmObjectsArray.size() - 1' why used? – PriyankaChauhan

ответ

4

for (int i = 0; i < alarmObjectsArray.size(); ++i/*I'm an old-fashioned cat*/){ будет индексировать более каждый элемент в массиве. (i будет начинаться с 0 и заканчивать с и включать значение, меньшее, чем размер массива).

Удалить -1 срок.

Для избежания сомнений, массивы Java составляют . Java - это не Фортран, вы знаете.

И, наконец, < size() более идиоматично, чем эквивалент <= size() - 1. Futhermore size() - 1 может давать чистую devilry в C++, если size() является неподписанным типом - как это часто бывает - и бывает нулевым!

+0

он работает петля с нуля, что является правильным –

+0

Yup. Массивы на Java основаны на нуле. – Bathsheba

+0

Я смущен? Индекс равен 0, 1, 2, а размер массива - 3, цикл for - 0, 1,2,3. Или я пропускаю что-то ха-ха? –

2

Давайте проанализируем этот код:

for (int i = 0; i < alarmObjectsArray.size()-1; i++) 
  • for означает, что код внутри цикла выполняется, пока условие истинно.

  • Первый цикл будет работать с i = 0, как вы правильно установили.

  • Каждый цикл добавит 1 к i, так как вы написали i++.

  • Ваше условие выхода i < size-1.Так как size = 3, это означает i < 3-1, равно i < 2 так что код будет работать в течение г = 0 и г = 1

Это означает, что код будет работать только 2 раза.

Для петли, если вы хотите избежать foreach, используйте i < size или i <= size-1, иначе вы потеряете изделие.

Надеюсь, вы поняли объяснение.

+0

Благодарим вас за разъяснение. –

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.

+1

Благодарим за помощь. Теперь я вижу свою ошибку. ура –