Pessoal ja procurei no forum mas não encontrei oque estou tentando fazer, se alguém puder me ajudar agradeço. A minha dúvida é a seguinte.
Tenho um vetor de string com nomes, quero selecionar aleatoriamente esses nomes e lançar para um Jtable, mas não sei como fazer isto. Ha tem uma condição os nomes não podem repetir mais de 2 vezes seguidas em cada coluna. Se alguem puder me ajudar fico grato.
Abaixo o fonte do que eu consegui.
importjava.awt.Color;importjava.awt.Rectangle;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Random;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JTable;publicclassTabelaextendsJFrame{privatestaticfinallongserialVersionUID=1L;privateJPaneljContentPane=null;privateJTablejTable=null;publicTabela(){super();initialize();}privatevoidinitialize(){this.setSize(446,288);this.setResizable(false);this.setContentPane(getJContentPane());this.setTitle("JFrame");}privateJPanelgetJContentPane(){if(jContentPane==null){jContentPane=newJPanel();jContentPane.setLayout(null);jContentPane.add(getJTable(),null);jContentPane.add(getJButton(),null);}returnjContentPane;}privateJButtonjButton=null;String[]nome={"Paulo","Carlos","Maria"};Stringnomes;//Paulo deve repetir 4 vezes//Carlos deve repetir 2 vezes//Maria deve repetir 3 vezes//Observação nenhum nome pode repetir mais de 2 vezes na mesma coluna.privateJTablegetJTable(){if(jTable==null){jTable=newJTable(3,3);jTable.setRowHeight(25);jTable.setBackground(Color.yellow);jTable.setEnabled(true);jTable.setBounds(newRectangle(43,142,351,75));}returnjTable;}privateJButtongetJButton(){if(jButton==null){jButton=newJButton();jButton.setBounds(newRectangle(233,45,145,35));jButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){MandarNomes();}});}returnjButton;}publicvoidMandarNomes(){for(inti=0;i<=8;i++){RandomrandomNum=newRandom();this.nomes=nome[randomNum.nextInt(3)];System.out.println(nomes);}}}
elaborei um algoritmo para fazer o sorteio, mas tem que tomar cuidado para não entrar em loop infinito com situações como 3 nomes distintos e 7 colunas na tabela, pois é impossível preencher a coluna repetindo no máximo 2 vezes o mesmo nome.
Cuidado. Testar na lista se um nome existe e então sortea-lo novamente é um processo extramamente ineficiente, principalmente se o número de nomes for próximo ou menor do que o número de colunas (o que é o caso).
O ideal é você embaralhar a lista, depois usar a lista embaralhada.
Assim você pode pegar um nome por vez, sem a preocupação dele já ter sido inserido ou não. Se a lista de nomes acabar, embaralhe-a novamente e continue o processo.
Para que o nome não se repita mais do que duas vezes, basta ter uma lista de nomes que corresponda a pelo menos a metade do tamanho do número de colunas.
ViniGodoy
Só a título de exemplo, uma usuária do GUJ já teve um problema com a abordagem de “sortear e testar que existe”, ao ponto da aplicação J2ME dela travar:
A solução foi usar o algorítmo que propus acima.
tiora
Muito obrigado pessoal vou dar uma olhada nos códigos e ver se consigo resolver meu problema.
InSeOfKn
Boa ViniGodoy, sempre que foi necessário sortear alguns valores sem repetir eu ia sorteando até encontrar um valor valido, agora percebo que não é uma boa ideia, pois como você mesmo disse, pode acontecer de demorar um seculo para encontrar esse valor ou encontrar na primeira tentativa, levando o programa a demorar um tempo incalculável!
Vivendo e aprendendo!
Até!
ViniGodoy
Esse processo só é interessante se seu espaço amostral é muito maior do que o número de amostras que vc vai retirar. Isso é, vc tem, por exemplo, 1000 números possíveis, e vai escolher só 5.
Possivelmente vc vai conseguir sortear os 5 sem problemas.
Se o tamanho for próximo ou inferior (100 números para escolher 99) o esforço para escolher os últimos números será incrível. Nesse caso, é melhor usar o sort.
O sort da lista tem tempo de O(n), onde N é o tamanho da lista.
Uma outra vantagem desse algorítmo é que seu tempo é constante, o que pode ser importante se vc precisar de previsibilidade.
InSeOfKn
Obrigado pelas informações! é por isso que adoro tanto esse fórum!
tiora
Pessoal as strings estão saindo aleatorias como eu queria, mas não estou conseguindo introduzilas na tabela 3x3 na forma acima em que em cada coluna cada nome não pode repetir mais de 2 vezes, é que estou começando java agora e não sei muita coisa.
InSeOfKn
Apos ter o algorítimo de sorteio, é só criar um TableModel que satisfaça sua necessidade, a assinatura do construtor pode ser a seguinte: