Imprimir e apagar conteudo de ArrayList mediante caracter

Tenho um método que recebe dados e adiciona em um ArrayList que funciona.
Tenho outro método que checa quando a letra é um “p” ele imprime as 3 próximas linhas do ArrayList que também funciona.

Porém agora eu preciso automatizar isso, preciso que quando a letra seja “p” ele imprima e apague restartando dessa forma o processo de preenchimento da ArrayList iniciando o loop novamente.

O máximo que consegui foi imprimir e ao apagar perdeu toda a ordem, bagunçando tudo. Seguem os métodos:

public void serialEvent(SerialPortEvent ev){
switch (ev.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] bufferLeitura = new byte[16];
try {
while ( entrada.available() > 0 ) {
nodeBytes = entrada.read(bufferLeitura);
}
String dadosLidos = new String(bufferLeitura);
if (bufferLeitura.length == 0) {
    JOptionPane.showMessageDialog(null,
                    "Nada foi lido. Verifique a balança!",
                    "Aviso!",
                    JOptionPane.WARNING_MESSAGE);
//System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
    JOptionPane.showMessageDialog(null,
                    "Apenas 1 byte foi lido. Verifique a balança!",
                    "Aviso!",
                    JOptionPane.WARNING_MESSAGE);
//System.out.println("Apenas um byte foi lido!");
} else { 
    dadosTotal.add(dadosLidos);

}
}catch(Exception e) {
    JOptionPane.showMessageDialog(null,
                    "Erro durante leitura! STATUS: " + e,
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
//System.out.println("Erro durante a leitura: " + e );
}
//System.out.println("n.o de bytes lidos : " + nodeBytes );
break;
}
}

Método de impressão:

public void imprimeArray(){
try{
for (int i = 0; i < dadosTotal.size(); i++){
    str = (String)it.next();
    index = str.indexOf('p');
    if (index > -1){
        String pesoTotal;
        pesoTotal = dadosTotal.get(i + 1).toString().substring(0, 2) +
                "," + dadosTotal.get(i + 2).toString().substring(0, 2) +
                dadosTotal.get(i + 3).toString().substring(0, 2);
        Main.jTextFieldPeso.setText(pesoTotal);
        i = dadosTotal.size();
        Thread.sleep(100);
    }    
}
}catch(ConcurrentModificationException cme){
    JOptionPane.showMessageDialog(null,
                    "Erro de concorrência. Tente novamente! STATUS: " + cme,
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
}catch(InterruptedException ie){
    ie.printStackTrace();
}
}

Alguém aí tem alguma luz.

cara não tá faltando os breaks na tua cláusula switch

Já chequei isso, mas deve ser outra coisa.

Se eu ponho um botão quando clico funciona legal, o que tá pegando é como fazer a impressao e deletar de forma sincronizada.