Не удается вызвать метод remove() в списке строк в groovy

#arraylist #groovy

#arraylist #groovy

Вопрос:

Я пытаюсь удалить строку с определенным индексом в моем списке строк, однако, похоже, я не могу вызвать метод list.remove() в groovy.

 public List getCassetteTypes(socket, numOfSlots){
 //get the cassettes layout
 sendCommand(socket, 'syst:layout? ')

 String systLayoutStr = readCommand(socket)
 //this String looks like: '1 ABC, 2 DEF, 3 SPN, ....'
    List listOfCassetteTypes = new ArrayList<String>()
 //I split the String at ',' because for each cassetteName, I want to remove the number before it
    listOfCassetteTypes = systLayoutStr.split(',')


    for(int i = 0; i < numOfSlots; i  ){
      //remove any white spaces
        listOfCassetteTypes[i] = listOfCassetteTypes[i].trim()
      //remove the numerical value
        listOfCassetteTypes[i] = listOfCassetteTypes[i].replace((i   1)   ' ', '')
        /* if the cassette name is 'SPN', 
      I want to remove it and append '-EXT' to the cassetteName before it,
      because 'SPN' means the previous slot is extended, 
      'SPN' itself isn't a cassette */
        if(listOfCassetteTypes[i].equalsIgnoreCase('spn')){
            listOfCassetteTypes[i - 1] = listOfCassetteTypes[i - 1].concat('-EXT')
   //this is what is not working for me, everything else is fine.
   listOfCassetteTypes = listOfCassetteTypes.remove(i)
        }
    }
    return listOfCassetteTypes
}
  

Я пробовал несколько разных способов, но, похоже, ни один из них не работает.

Комментарии:

1. Вы проверили возвращаемое значение ArrayList.remove в документе? Это удаленный элемент, а не список. Кроме того, после исправления этого убедитесь, что вы избегаете увеличения индекса, если вы удалили элемент, потому что после удаления элемента текущий индекс уже является следующим элементом.

2. @DodgyCodeException Я этого не заметил, я думал, remove() возвращает новый список с удаленным элементом

Ответ №1:

Вместо того, чтобы манипулировать списком, вы могли бы обрабатывать каждую запись в паре с ее преемником… Я полагаю, это делает то, что вам нужно?

 def layoutStr = '1 ABC, 2 DEF, 3 SPN, 4 GHI'

def splitted = layoutStr.split(',')
    *.trim()                        // remove white space from all the entries (note *)
    *.dropWhile { it ==~ /[0-9 ]/ } // drop until you hit a char that isn't a number or space
    .collate(2, 1, true)            // group them with the next element in the list
    .findAll { it[0] != 'SPN' }     // if a group starts with SPN, drop it
    .collect { 
        // If the successor is SPN add -EXT, otherwise, just return the element
        it[1] == 'SPN' ? "${it[0]}-EXT" : it[0]
    }

assert splitted == ['ABC', 'DEF-EXT', 'GHI']
  

Следующий вопрос

Чтобы просто получить номера тех, которых нет SPN :

 def layoutStr = '1 ABC, 2 DEF, 3 SPN, 4 GHI'

def splitted = layoutStr.split(',')
    *.trim()                                       // remove white space from all the entries (note *)
    *.split(/s /)                                 // Split all the entries on whitespace
    .findResults { it[1] == 'SPN' ? null : it[0] } // Only keep those that don't have SPN
  

Обратите внимание, что это список строк, а не целых чисел… Если вам нужны целые числа, то:

     .findResults { it[1] == 'SPN' ? null : it[0] as Integer }
  

Комментарии:

1. Это сделало то, что я хотел!

2. с другой стороны, как я мог бы собирать числа только для строк, которые не являются ‘SPN’?

3. Это еще один вопрос, который я слышу? 😜 Обновленный ответ

4. еще 1 последующий вопрос: что, если я хочу удалить последовательность ‘SPN’ и не хочу добавлять ‘-EXT’ к предыдущей. Другими словами, из последовательности в вопросе, что, если я просто хочу [‘ABC’, ‘DEF’, ‘GHI’]

5. Удалите код из collate down и замените на .findAll { it != 'SPN' }