如果循环离开最后一项

时间:2011-11-22 20:12:23

标签: android list if-statement arraylist boolean

我有一个列表数组的歌曲,我想将所有以相同的第一个字母开头的歌曲添加到同一部分。这个循环和方法有效,除了它不包括songstoadd列表数组中的最后一首歌。

对于while循环,问题不在于检查布尔值的if语句。

Collections.sort(songtitle);

int m = 0;
ArrayList<String> songstoadd1 = new ArrayList<String>();
boolean stringsequal = true;
while( m <songtitle.size()-1){
    stringsequal = false;

    if(songtitle.get(m).substring(0, 1).equals(songtitle.get(m+1).substring(0, 1))){
        stringsequal = true;
        if(stringsequal){ // THis is the Issue
            songstoadd1.add(songtitle.get(m));
            songstoadd1.add(songtitle.get(m+1));  ///// This is where it leaves off last item in the list ////////////
            stringsequal = false;
            m++;
            Toast.makeText(getApplicationContext(),  songtitle.get(m) +"  " +  songtitle.get(m+1), Toast.LENGTH_LONG).show();

        }
        adapter.addSection(songtitle.get(m).substring(0, 1), new ArrayAdapter<String>(getApplicationContext(),R.layout.song, songstoadd1));
        m+=songstoadd1.size();
    }else{
        ArrayList<String> songstoadd = new ArrayList<String>();
        songstoadd.add(songtitle.get(m));
        adapter.addSection(songtitle.get(m).substring(0, 1), new ArrayAdapter<String>(getApplicationContext(),R.layout.song, songstoadd));
        m++;
    }

}
setListAdapter(adapter);

}

4 个答案:

答案 0 :(得分:3)

您的while循环不正确。

  

while(m&lt; songtitle.size() - 1){

你要两次处理零指数。

要么&lt; = OR删除-1

答案 1 :(得分:1)

你的循环不变量被一个人关闭。您需要:while( m <songtitle.size()){

然后,由于你在列表中提前检查1,你可以这样做:

String lastChar =""; 
ArrayList<String> songsToAdd = new ArrayList<String>();

while(m < songtitle.size()){
    if(lastChar.equals(songtitle.get(m).substring(0,1)){
       songsToAdd.add(songtitle.get(m));
    }else{
       //if we're here, we need to start a new section so add everything we've already accumulated to the list view
       adapter.addSection(lastChar, new ArrayAdapter<String>(getApplicationContext(),R.layout.song, songsToAdd));

       lastChar = songtitle.get(m).substring(0,1);
       songsToAdd = new ArrayList<String>();
       songsToAdd.add(songtitle.get(m));
    }  
m++; 
}


//now handle the last section
if(songsToAdd.size()>0){
    adapter.addSection(lastChar, new ArrayAdapter<String>(getApplicationContext(),R.layout.song, songsToAdd));

答案 2 :(得分:1)

m+=songstoadd1.size()行似乎完全关闭...... m++就足够了。

如果您有3首以相同字母开头的歌曲,则循环的第一遍将把2首首歌添加到列表中,增加m(在m++行),然后添加2到mm+=songstoadd.size()行。然后m3,循环退出。

然而,请注意,它可能会将问题转移到其他地方...你最好有一个内部循环,当歌曲具有相同的第一个字母时增加m,并且添加一个外部循环创建包含新部分的内容在内循环中找到的歌曲。

类似的东西:

while( m < songtitle.size() ){
    n = m+1;
    songstoadd1.add(songtitle.get(m));
    while ( (n<songtitle.size()) && (songtitle.get(m).substring(0, 1).equals(songtitle.get(n).substring(0, 1))) ){
            songstoadd1.add(songtitle.get(n));
            n++;
    }
    adapter.addSection(songtitle.get(m).substring(0, 1), new ArrayAdapter<String>(getApplicationContext(),R.layout.song, songstoadd1));
    songstoadd1.clear(); // i don't know if this method exists, anyway it should clear the list content
    m = n;
}

答案 3 :(得分:0)

如何改变

while( m <songtitle.size()-1){

while( m <songtitle.size()){

if(songtitle.get(m).substring(0, 1).equals(songtitle.get(m+1).substring(0, 1))){

if(m == (songtitle.size()-1) &&
songtitle.get(m).substring(0, 1).equals(songtitle.get(m+1).substring(0, 1))){

你应该使用m&lt; songtitle.size()在循环中,但是如果没有这个改变,下面的.get(m + 1)将失败。

m+=songstoadd1.size();

应该改为

m++:

据我所知。