Sorteio de String sem repetição

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Sorteia {
    public String sorteia (){
        List<String> lista = new ArrayList<String>() ;
        lista.add ("Francisco Lucimar") ; 
        lista.add ("Gustavo Oliveira") ;
        lista.add ("Hermenegildo Coelho") ;
        lista.add ("Janaina de Paula") ;
        lista.add ("Jasiel Figueiredo") ;
        lista.add ("Jhony Weslem") ;
        lista.add ("Judson Leal") ;
        lista.add ("Larissa Gomes") ;
        lista.add ("Maria Érica") ;
        lista.add ("Matheus Félix") ;
        lista.add ("Melchior Felix") ;
        lista.add ("Naisson Gomes") ;
        lista.add ("Railda Oliveira") ;
        Collections.shuffle(lista) ;
        // pega qualquer indice.
        return lista.get((int)Math.random() * lista.size());
    }
    public static void main(String []args){
        Sorteia sorteia = new Sorteia();
        for(int i = 0; i<1; i++){
                      System.out.println(sorteia.sorteia());    
        }
    }
}

Desculpem, não sei porque o texto não saiu, mas eu quero ajuda pra mudar meu código, pois este faz repetição no sorteio de nomes. Como devo fazer com que ele realize o sorteio sem repetir um nome sorteado?

Olá

Conheço 3 formas, sendo duas mantendo todos os elementos na lista, vai ser necessário mudar seu código dependendo da forma q escolher, mas para todas elas será necessário q a lista seja atributo da classw:

public class Sorteia {
    List<String> lista = new ArrayList<String>() ;
    public String sorteia (){
        // List<String> lista = new ArrayList<String>() ; movido
        lista.add ("Francisco Lucimar") ; 

1 - Crie uma segunda lista

List<String> listaSorteio = new ArrayList<String>(lista);
String sorteado = listaSorteio.remove((int) (Math.random() * listaSorteio.size()));

2 - Trocando elementos com um contador de elementos

int qtdElementos = lista.size();

int indice = (int)(Math.random() * qtdElementos);
String sorteado = lista.remove((int) (Math.random() * qtdElementos));
listaSorteio.add(sorteado); // o elemento será adicionado no final
qtdElementos = qtdElementos - 1; // para não pegar os ultimos elementos q ja foram sorteados

3 - Usar o remove ao invés do get, entretanto não mantém os elementos na lista

return lista.remove((int)(Math.random() * lista.size()));

Observação:

(int)Math.random() * lista.size()
e
(int)(Math.random() * lista.size())

terão resultados diferentes

Obrigado por responder diego12, fiz o 3 método que não mantém os elementos na lista, porém ao executar ele continua repetindo elementos que já foram sorteados. Enquanto ao 1 método tenho uma dúvida, é necessário adicionar os elementos na primeira e na segunda lista? E qual é o retorno que eu uso no final?

public class Testes {
    private static final List<String> LISTA = new ArrayList<String>();
    
    public static void inicializaLista() {
        LISTA.add("Francisco Lucimar");
        LISTA.add("Gustavo Oliveira");
        LISTA.add("Hermenegildo Coelho");
        LISTA.add("Janaina de Paula");
        LISTA.add("Jasiel Figueiredo");
        LISTA.add("Jhony Weslem");
        LISTA.add("Judson Leal");
        LISTA.add("Larissa Gomes");
        LISTA.add("Maria Érica");
        LISTA.add("Matheus Félix");
        LISTA.add("Melchior Felix");
        LISTA.add("Naisson Gomes");
        LISTA.add("Railda Oliveira");
    }
    
    public static int randInt(int min, int max) {
        return (min + (int)(Math.random() * ((max - min) + 1)));
    }
    
    public static String sorteia() {
        Collections.shuffle(LISTA);
        int index = randInt(0, LISTA.size() - 1);
        return LISTA.remove(index);
    }
    
    public static void main(String[] args) {
        inicializaLista();
        int size = LISTA.size();
        for(int i = 0; i < size; i++){
            System.out.println(sorteia());    
        }
    }
}

Muito bom, deu certo aqui!