【问题标题】:if loop is leaving off last item如果循环正在离开最后一项
【发布时间】:2012-01-04 05:05:14
【问题描述】:

我有一个歌曲列表数组,我想将所有以相同首字母开头的歌曲添加到同一部分。此循环和方法有效,只是它忽略了 songtoadd 列表数组中的最后一首歌曲。

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

}

【问题讨论】:

  • stringsequal = true; 在这里没用,你在下面一行测试一下(这样测试总会成功,或者缺少一部分代码),然后在退出之前重置它if 块,并且您根本不会在其他任何地方使用该变量。

标签: android list if-statement arraylist boolean


【解决方案1】:

您的 while 循环不正确。

while(m

您需要处理两次零索引。

要么做

【讨论】:

  • 谢谢你,但你可以检查编辑,因为问题在别处
  • 这就是您所问问题的解决方法。进行更改后遇到什么错误?
【解决方案2】:

你的循环不变量减一。你需要:while( m &lt;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));

【讨论】:

  • 除非我有它必须存在的 -1,否则我会强制关闭
  • 我认为最好稍微重组一下你正在做的事情。我根据您的更新更新了我的答案。
  • 谢谢,但这是一个无限循环,你知道为什么吗
  • 是的,我忘了在循环底部增加 m。对于那个很抱歉。响应已编辑并修复。
【解决方案3】:

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

如果您有 3 首歌曲以相同的字母开头,则循环的第一遍会将前 2 首歌曲添加到列表中,增加 m(在 m++ 行),然后将 2 添加到 m (在m+=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;
}

【讨论】:

  • 我删除了 m+=songstoadd1.size(),现在它只给了我列表中的最后一首歌
  • @Waggoner_Keith:您必须用m++ 替换该行。但请参阅我的编辑,内部循环可能更清晰。
  • 你的方法得到了一个强制关闭以及每个while循环不是sontitle.size()-1的方法
  • ???问题出在哪里 ??? songtitle.size() 返回列表的大小,不是吗?所以如果m总是低于size,应该没问题吧?
【解决方案4】:

换个方式

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

还有

m+=songstoadd1.size();

应该改成

m++:

据我所知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2021-12-25
    • 2021-08-14
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    相关资源
    最近更新 更多