簡體   English   中英

For循環創建的數組的值比預期的少

[英]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 < sizei <= 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 因此,如果要遍歷所有索引,則必須從0array.size()-1進行循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM