2016-09-20 6 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); 
    } 

가 for 루프에서 올 때 유일한 것은이 내가 함께 새로운 배열의 크기를 확인 :

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

내가 얻을 :

I/System.out: Testing2 

배열에서 배열로 옮겨 졌을 때 어떻게 든 사라졌습니다. for 루프에 많은 텍스트가 있음을 알고 있지만 하나가 적은 이유는 알 수 없습니다.

+1

아마도 alarmObjectsArray.size() - 1 때문에? – Blackbelt

+1

'(int i = 0; i Eran

+0

'alarmObjectsArray.size() - 1' 이유는 무엇입니까? – PriyankaChauhan

답변

4

for (int i = 0; i < alarmObjectsArray.size(); ++i/*I'm an old-fashioned cat*/){은 배열의 요소마다 개에 대해 색인을 생성합니다. (i은 0에서 시작하여 배열의 크기보다 작은 값을 포함하여 끝납니다).

-1 항을 삭제하십시오.

의심의 여지를 피하기 위해 Java 배열은 0을 기점으로입니다. Java는 Fortran이 아닙니다.

마지막으로 < size()은 해당 <= size() - 1보다 관용적입니다. 더구나 size() - 1size()이 부호가없는 유형 인 경우 C++에서 완전한 악마대를 산출 할 수 있습니다. 흔히 그렇듯이 0이됩니다.

+0

그는 정확히 0 인 루프를 실행 중입니다. –

+0

예. Java의 배열은 0부터 시작합니다. – Bathsheba

+0

혼란 스럽습니까? 인덱스는 0, 1, 2이고 배열 크기는 3이고 for 루프는 0, 1,2,3을 통과합니다. 또는 나는 haha가 무언가 놓치고 있냐? –

2

은의이 코드를 분석해 보겠습니다 :

for (int i = 0; i < alarmObjectsArray.size()-1; i++) 
  • for

    은 조건이 참이 될 때까지 루프 내부의 코드가 수행된다는 것을 의미합니다.

  • 올바르게 설정하면 첫 번째 루프는 i = 0과 함께 실행됩니다.

  • i++을 작성한 이후 모든 루프는 1을 i에 추가합니다.

  • 종료 조건은 i < size-1입니다.size = 3 때문에,이 i < 3-1을 의미 = 그래서 코드가 에 출마 난 것 i < 2 0에 해당하고 난 = 1

이 코드는 2 번 실행을 의미합니다.

for 루프에서 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 

어레이는 105 개 세포를 갖는다. The're 0-indexed 그래서 인덱스는 0부터 시작합니다. 마지막 셀의 인덱스는 array.size() - 1입니다. 따라서 모든 인덱스를 반복하려면 0에서 array.size()-1까지 루프해야합니다.

+1

도와 주셔서 감사합니다. 나는 지금 나의 잘못을 본다. 건배 –

관련 문제