Pessoal preciso determinar o nome de uma variável de forma dinamica, tipo:
ponho um incremento i++ e depois monto o nome da variável da seguinte forma:
nomevariavel + valordei
Tem como fazer isso?
quase certeza que não
Em javascript existe a funcao eval() que poderia fazer isso. Em Java eu nunca vi nada parecido.
Nao existe outra maneira de implementar o que vc esta querendo? Vc nao pode utilizar um array?
[quote=eduveks]Não, em Java isto não é possível fazer… Java é uma linguagem compilada, e só se executa código compilado em bytecode…
Para isto tens q usar uma linguagem de Script… como Jython ou LuaJava…
http://www.keplerproject.org/luajava/
Existe muitas outras, mas na minha opinião estas duas são as melhores.[/quote]
http://www.guj.com.br/posts/list/39561.java
Duas maneiras de fazer isto…
:arrow: ArrayList manhoso com um objeto que contem o nome e o conteudo das “variaveis”…
:arrow: Linguagem de Script, acho que esta seria a melhor solução…
Em termos de desempenho um ArrayList é capaz de ser melhor, mas o mais prático é o uso de uma linguagem de script…
Seria mais fácil fazer isso daí acho que usando Map, a chave sendo uma string com o nome da variável e o valor associado com essa chave…
flw
Em PHP temos algo parecido com isso então eu perguntei se dava para fazer isso também. Vou tentar implementar a minha idéia de outra forma.
Ai que ta meu, PHP é interpretada e dai tem estas facilidades, Java é compilado, são bem diferentes…
Seria mais fácil fazer isso daí acho que usando Map, a chave sendo uma string com o nome da variável e o valor associado com essa chave…
flw
[/quote]
Sim é melhor, é q ainda tenho o vicio do ArrayList, sorry…
java.util.HashMap e não ArrayList…
Thx dudaskank
Cara estou com uma dúvida muito idiota, como sou novato em Java não sei como ir adicionando valor a um Array.
Alguém pode dar uma luz?
Alguns exemplos:
ArrayList al = new ArrayList();
al.add("Texto");
HashMap hm = new HashMap();
hm.put("chave","valor");
String[] s = new String[1];
s[0] = "Texto";
Ótimo, agora clariou bastante.
E para um Array de bytes? Tem como?
Claro, um ArrayList e um HashMap podem receber qualquer objeto que vc quiser. E vc pode declarar um array de qualquer objeto tambem:
Byte vByte = new Byte("valor");
ArrayList al = new ArrayList();
al.add(vByte);
HashMap hm = new HashMap();
hm.put("chave",vByte);
Byte[] b = new Byte[1];
b[0] = vByte;
Muito bom.
Estava procurando mas não achei uma forma de imprimir determinado elemento, pois estou fazendo um leitura de uma porta serial e carregando o ArrayList com bytes.
Em determinado momento ele passa a informação (p`) em bytes, queria após identificar isso imprimir as 3 próximas linhas desse ArrayList.
Procurei até agora e não encontrei uma forma. Vc já precisou fazer algo assim?
P.S.: o ArrayList está sim sendo carregado, pois a minha rotina se eu imprimir direto ele imprime linha a linha os bytes recebidos.
Eu nunca precisei fazer nada parecido, na verdade nunca trabalhei com Bytes. Fiz uns testes aqui e new Byte(“p`”) da erro, nao sei como deveria ser criado esse byte.
Porem fiz um exemplo parecido mas procurando pela String “4”. Da uma olhada se serve para alguma coisa:
ArrayList<Byte> al = new ArrayList<Byte>();
al.add(new Byte("0"));
al.add(new Byte("1"));
al.add(new Byte("2"));
al.add(new Byte("3"));
al.add(new Byte("4"));
al.add(new Byte("5"));
al.add(new Byte("6"));
al.add(new Byte("7"));
al.add(new Byte("8"));
// Armazena em i o valor do índice referente ao elemento desejado (no caso 4)
Iterator it = al.iterator();
Byte vByte;
int i = 0;
while (it.hasNext()) {
vByte = (Byte)it.next();
if (vByte.toString().equals("4")) {
break;
}
i++;
}
// Incrementa para recuperar o próximo elemento
i++;
// Imprime os 3 elementos seguintes
for (int indice = i; indice < i+3; indice++ ) {
System.out.println("Elemento "+((Byte)al.get(indice)).toString());
}
Cara tinha me expressado mal, na verdade o (p`) é quando eu converto o byte em string e mando ele imprimir.
Mas é o seguinte implementei o seu exemplo no método que faz a leitura, para ele ir carregando o ArrayList, mas não imprime nada, olhei e realmente ele captura os dados da balança, mas não funfa.
Estou postando o código, se vc puder dar uma olhada, talvez seja algum erro tosco de minha parte.
O código que peguei de vc eu comentei como GUJ para facilitar.
public void serialEvent(SerialPortEvent ev){
//Guj
ArrayList DadosTotal = new ArrayList();
//Fim
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) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
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;
}
//Guj
Iterator IndiceIt = DadosTotal.iterator();
int i = 0;
String Dados;
while(IndiceIt.hasNext()){
Dados = (String)IndiceIt.next();
if(Dados.equals("p")){
break;
}
i++;
}
i++;
for(int Indice = i; Indice < i + 3; Indice++){
System.out.println("Elemento" + DadosTotal.get(Indice));
}
//Fim
}
Existem algumas variaveis que eu nao sei para que servem: nodeBytes e entrada.
A menos que o entrada.read() grave alguma coisa no bufferLeitura vc tera uma String vazia ao criar Dadoslidos. E se for esse o caso nao havera nenhum elemento para o IndiceIt recuperar com hasNext().
Verifique se eh alguma coisa relativa a isso.
Caso o metodo entrada.read() popule algum elemento de bufferLeitura, vc teria apenas um elemento em DadosTotal, pois existe apenas um DadosTotal.add().
Dica: no bloco que eu lhe passei como exemplo eu criava o ArrayList para percorrer com o Iterate e por isso tinha certeza de que existiriam 3 elementos apos o elemento que eu estava procurando. Como no seu caso acredito que vc nao tenha certeza do que existira no conjunto que vc ira trabalhar seria interessante testar se o i++ eh menor do que o ultimo elemento do Array e tambem a cada laco do Iterate se existe um proximo elemento para ser recuperado.
Dica 2: utilize minusculas no inicio dos nomes de suas variaveis e maiusculas para separar palavras. Dadoslidos por exemplo ficaria dadosLidos. Se vc declarar o nome da variavel comecando com maiuscula fica parecendo um classe e confunde um pouco.
Entrada faz um get na porta serial, tanto que se eu colocar um System… em Dadoslidos ele vai imprimindo linha a linha o conteúdo.
Sinceramente não sei o porque de tudo isso.
Acho que assim esta mais perto do que vc precisa. Roda ai e ve o que imprime.
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);
}
if (bufferLeitura.length == 0) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1) {
System.out.println("Apenas um byte foi lido!");
} else {
int index = 0;
for (int i = 0; i < bufferLeitura.length; i++) {
System.out.println("Elemento["+i+"] : " + bufferLeitura[i]);
}
}
} 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;
}
}
Cara estou mexendo no que vc passou aqui, mas tá complicado, só imprime a quantidade de bytes lidos.
Tá complicado mesmo por aqui.
Eu nunca trabalhei com Comm nem com RXTX mas me diz qual eh o pacote e a classe dos objetos nodeBytes e entrada que eu vou verificar se consigo descobrir alguma coisa…