если цикл отключается от последнего элемента - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть список песен, и я хочу добавить все песни, которые начинаются с одной и той же первой буквы, в один и тот же раздел. Этот цикл и метод работают, за исключением того, что он исключает последнюю песню в массиве списка 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 ]

3 голосов
/ 23 ноября 2011

Ваш цикл while неверен.

while (m

1 голос
/ 23 ноября 2011

, что m+=songstoadd1.size() строка кажется полностью отключенной ... m++ было бы достаточно.

если у вас есть 3 песни, начинающиеся с одной и той же буквы, первый проход цикла добавит 2 первые песниувеличьте значение m (в строке m++), затем добавьте 2 к m (в строке m+=songstoadd.size(). Затем m равно 3 и цикл завершится.

обратите внимание, однако, что это может переместить проблему в другое место ... вам лучше иметь внутренний цикл, который увеличивает 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;
}
1 голос
/ 23 ноября 2011

Ваш инвариант цикла отключен на единицу. Вам нужно: 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));
0 голосов
/ 23 ноября 2011

Как насчет изменения

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++:

.

...