Не могу вызвать метод remove () для списка строк в groovy - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь удалить строку с определенным индексом в моем списке строк, но я не могу вызвать метод 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 Ответ

1 голос
/ 29 марта 2019

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

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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...