#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' }