Nome da variável dinamico

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.jython.org

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…