Split String [RESOLVIDO]

19 respostas
VitaliBR

Bom, tentei aqui mais to com uns problemas e duvidas:

Dentro do meu main tenho um loop while:
while(true)
        {  
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);
             
            //Recebe os valores de R G B
            String ColorString = new String(chunk);
                
            String[] dataColor = ColorString.split(" ");  
            for(int i =0; i < dataColor.length ; i++) 
            { 
                System.out.print(dataColor[i]);                           
            }  
        }

Ele recebe os valores assim: "0 0 0", "123 14535 435324", etc...
e desse jeito que fiz mostra assim: "000", "12314535435324", etc...

Se tento colocar println
System.out.println(dataColor[i]);
ele fica loco e fica mostrando "em branco" e indo pra proxima linha :?

Por que? tentei salvar esses 3 valores em variaveis separadas assim e nao foi :?

String[] dataColor = ColorString.split(" ");  
            for(int i =0; i < dataColor.length ; i++) 
            { 
                if(i == 0)
                    ColorR = dataColor[i];
                if(i == 1)
                    ColorG = dataColor[i];
                if(i == 2)
                    ColorB = dataColor[i];                     
            }

Se alguem puder me ajudar, agradeço :)

19 Respostas

nel

Oi!

Ao invés de " " tente usar \s, veja se obtem o mesmo resultado :slight_smile:
Sobre “ficar louco”, se você imprimi usando print() ou println() a única diferença, é que para cada iteração do seu laço, ele apresenta o resultado em um nova lina, simples assim.
Sendo assim, se imprimi correto com print() deve imprimir com println().

Poste o seu código completo, o valor de entrada e o(s) valor(es) de saída.
Abraços.

VitaliBR

Oi! :)

entao cara, tentei com println, mas ele fica "louco" e comeca a mostrar apenas "espacos em branco"...

Tentei assim:
String[] dataColor = ColorString.split("\s");  
            for(int i =0; i < dataColor.length ; i++) 
            { 
                System.out.print(dataColor[i]);                           
            }

Ele mostra os valores todos juntos, até ai tudo bem
mas se tento assim:

String[] dataColor = ColorString.split("\s");  
            for(int i =0; i < dataColor.length ; i++) 
            { 
                System.out.print(dataColor[i] + " ");                           
            }
Ele fica "louco" de novo :? Meu codigo completo:
package arduinojava;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.InputStream;
import java.io.OutputStream;
import processing.app.Preferences;
 
public class ArduinoJava 
{
 
    static InputStream input;
    static OutputStream output;

    static public class MyPrefs extends Preferences 
    {
        static public void init() 
        {
            Preferences.init("C:\Documents and Settings\Administrador.VITALI\"
                           + "Dados de aplicativos\Arduino\preferences.txt");
        }
    }
    
    public static void main(String[] args) throws Exception
    {
        boolean Calibrate = false;

        //our measured color and color for calibration
        float ColorR = 0, ColorG = 0, ColorB = 0;
        float CalibR = 1, CalibG = 1, CalibB = 1; //not zero to avoid devision by 0

        new Interface().setVisible(true);
        
        MyPrefs.init();
        System.out.println("Using port: " + MyPrefs.get("serial.port"));
        System.out.println("Using board: " + MyPrefs.get("board"));
        CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(
                MyPrefs.get("serial.port"));
 
        SerialPort port = (SerialPort)portId.open("serial talker", 4000);
        
        // open the streams
        input = port.getInputStream();
        output = port.getOutputStream();
        port.setSerialPortParams(MyPrefs.getInteger("serial.debug_rate"),
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        
        
        while(true)
        {  
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);
             
            //Recebe os valores de R G B
            String ColorString = new String(chunk);

            // Mostra o que foi obtido da conexao serial c/ Arduino
            //System.out.print(ColorString);
                
            String[] dataColor = ColorString.split("\s");  
            for(int i =0; i < dataColor.length ; i++) 
            { 
                System.out.print(dataColor[i] + " ");                           
            }  
        }
    }
}

[]'s

VitaliBR

hehehe fui meio infeliz no “louco” né wellington?

Está assim:

Fazendo assim System.out.print(dataColor[i] + " ");
esperava que aparecesse:

0 0 0
1234 2345 46
4234543 5345643 123
123 123 53




etc…

espero que de pra entender :slight_smile:

EDIT:
lembrando que recebo meus dados da porta serial nesse formato:
“0 0 0\n”,“123 123 123\n”, etc…

[]'s

nel

Oi!

Suponha que você tenha a String ‘s’.
Qual exatamente o conteúdo dessa String ‘s’ que você quer aplicar o seu regex (Split) ?

Não entendi a linha

“0 0 0\n”,“123 123 123\n”
.
Por isso a pergunta acima.

Abraços.

VitaliBR
nel:
Oi!

Suponha que você tenha a String 's'.
Qual exatamente o conteúdo dessa String 's' que você quer aplicar o seu regex (Split) ?

Não entendi a linha

"0 0 0\n","123 123 123\n"
.
Por isso a pergunta acima.

Abraços.

Sim, tenho uma placa que esta enviando para mim via porta serial o seguinte conteudo: Valor inteiro + " " + Valor inteiro + " " + Valor inteiro + " " + "\n" ou seja esses valores inteiros variam de acordo com o meu sistema, mas fica sempre assim: "0 0 0 \n" por exemplo :) pra ficar mais claro, o código que envia pela porta serial:
Serial.print(analogRead(PIN_SENSOR));
	Serial.print(" ");

	Serial.print(analogRead(PIN_SENSOR));
	Serial.print(" ");
	
	Serial.print(analogRead(PIN_SENSOR));
	Serial.print(" ");
	
	Serial.print("\n");

Eu fiz meu código em C/C++ sem problemas, e estou tentando cria-lo em java agora, mas não sei muito de java por isso to apanhando :roll: rsrs

em C++ fiz assim (tao simples rs):
stringstream SS(ColorString);
SS>>ColorR>>ColorG>>ColorB;

[]'s

nel

Certo!

Isso aqui resolve o seu problema:

public static void main(String[] args) {
		String separator = System.getProperty("line.separator");
		String s = "0 0 0 \n";
		s = s.replaceAll(separator, "");
		String[] values = s.split("\s");
		for(String value : values)
			System.out.println(value);
	}

Certo?
Abraços.

VitaliBR

Nao funcionou :?

Eu to pesquisando aqui e cheguei a uma conclusao, com o 'read' eu leio bytes e ta tendo problemas de conversão para String,
estou certo?

Pois o exemplo do nel, funciona, mas quando tento trocar para usar minha String, não funciona :?

lembrando que estou lendo os bytes e convertendo para String assim:
int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);
             
            //Recebe os valores de R G B
            ColorString = new String(chunk);
nel
VitaliBR:
Nao funcionou :?

Eu to pesquisando aqui e cheguei a uma conclusao, com o 'read' eu leio bytes e ta tendo problemas de conversão para String,
estou certo?

Pois o exemplo do nel, funciona, mas quando tento trocar para usar minha String, não funciona :?

lembrando que estou lendo os bytes e convertendo para String assim:
int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);
             
            //Recebe os valores de R G B
            ColorString = new String(chunk);

Dê um System.out.println() na string ColorString (mude para colorString, padrão Java).

Abraços.

Vingdel

Já testou a variável ColorString pra ver o que ela imprime?

nel

Oi!

Além de verificar o que a sua String imprime, mude as linhas de código

int available = input.available();   
            byte chunk[] = new byte[available];   
            input.read(chunk, 0, available);   
               
            //Recebe os valores de R G B   
            ColorString = new String(chunk);

Para:

int available = input.available();   
        byte chunk[] = new byte[available];   
        input.read(chunk, 0, available);   
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream(available);
        baos.write(chunk, 0, available);
        byte[] colorByte = baos.toByteArray();
           
        //Recebe os valores de R G B   
        String colorString = new String(colorByte);

Abraços.

Vingdel

O que entra no seu array chunk?
Somente 3 indices com 0-255 cada?

Supondo que seja isso eu posso sugerir que você faça como eu fiz:
byte[] aa = {65,65,65};
		// Assim transformo byte[] em String
		String minhaString = "";
		for(int i = 0; i < aa.length; i++)			
			minhaString = minhaString+" "+aa[i];

		// Assim divido a String
		String[] minhasStrings = minhaString.split(" ");
		for(int i = 0; i < minhasStrings.length; i++)
			System.out.println(minhasStrings[i]);
EDIT: Saída: 65 65 65

Veja se te atende... Abraço!

VitaliBR

Po, a galera aqui é bem simpatica :)

Peço desculpas pela falta de conhecimento, sei que to precisando estudar java rs
mas enquanto não entro de férias do servico ou faculdade, ta complicado :(
e preciso terminar isso logo rsrs :)

Seguinte, tentei o que você disseram mas continua a imprimir os valores todos juntos quando uso o System.out.print():

run:
Using port: COM3
Using board: atmega328
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
000
000
000
000
000
895089
674693
323388
9940131
9446140
10547128
1044599
11454113
000
000
CONSTRUÍDO COM SUCESSO (tempo total: 21 segundos)

e só mostra espaços em branco quando uso o System.out.println():

run:
Using port: COM3
Using board: atmega328
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7

(e mais espacos em branco....)
CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)

:?

Minha ultima tentativa foi:
while(true)
{
            int available = input.available();     
            byte chunk[] = new byte[available];     
            input.read(chunk, 0, available);     

            ByteArrayOutputStream baos = new ByteArrayOutputStream(available);  
            baos.write(chunk, 0, available);  
            byte[] colorByte = baos.toByteArray();  

            //Recebe os valores de R G B     
            String colorString = new String(colorByte); 
                       
            String[] cores = colorString.split(" ");
            for(int i = 0; i < cores.length; i++)
                System.out.print(cores[i]);
}
"Vingdel":
Já testou a variável ColorString pra ver o que ela imprime?
Sim, testei fazendo isso:
System.out.print(colorString);
e obtive:
run: Using port: COM3 Using board: atmega328 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 0 0 0 0 1 15 58 33 48 86 45 67 82 48 117 110 39 157 110 37 153 0 0 0 0 0 0 CONSTRUÍDO COM SUCESSO (tempo total: 13 segundos)

Ps: to ficando louco, caramba viu :(
por que será que acontece tudo isso?? (de errado)

[]'s

Vingdel

Meu camarada, olha tua MP!

VitaliBR

Opa Vingdel :)

valeu mesmo pela força cara!

Abracos

EDIT:

Postando alguns testes que fiz:
int available = input.available();     
            byte[] chunk = new byte[available];     
            input.read(chunk, 0, available);     

            
            //Recebe os valores de R G B     
            String colorString = new String(chunk); 
            
            String[] cores = colorString.split("\s");
            for(int i = 0; i < cores.length; i++)
                System.out.println(i);

Ele mostra apenas 0, o i não era pra ir de 0 a 2 no meu caso? :?

Vingdel

Meu camarada, gostaria de ver esses resultados:

Você poderia substituir seu WHILE por este e me passar a saída que tu obteve?
while(true){
	int available = input.available();

	System.out.println("available: "+available);

	byte chunk[] = new byte[available];   
	input.read(chunk, 0, available);

	System.out.println("While...");
	for(int i = 0; i < chunk.length; i++)
		System.out.println("chunk["+i+"]: "+chunk[i]);

   
	//Recebe os valores de R G B   
	String ColorString = new String(chunk);
  
	// Mostra o que foi obtido da conexao serial c/ Arduino   
	System.out.print("ColorString: "+ColorString);   
	       
	String[] dataColor = ColorString.split("\s");

	for(int i =0; i < dataColor.length ; i++)
		System.out.print(dataColor[i] + " ");
}

[]'s

VitaliBR

Rodei o código:

run: Using port: COM3 Using board: atmega328 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: available: 0 While... ColorString: CONSTRUÍDO COM SUCESSO (tempo total: 7 segundos)

Estranho não? :?

EDIT: Fiz assim agora:
while(true)
{
            int available = input.available();
            
            byte chunk[] = new byte[available];   
            input.read(chunk, 0, available);

            for(int i = 0; i < chunk.length; i++)
		System.out.println("chunk["+i+"]: " + chunk[i]);

            //Recebe os valores de R G B   
            String ColorString = new String(chunk);
}

Obtive:

run:
Using port: COM3
Using board: atmega328
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
chunk[0]: 48
chunk[1]: 32
chunk[0]: 48
chunk[1]: 32
chunk[0]: 48
chunk[1]: 32
chunk[2]: 10
chunk[0]: 48
chunk[1]: 32
chunk[0]: 48
chunk[1]: 32
chunk[0]: 48
chunk[1]: 32
chunk[2]: 10
chunk[0]: 48
chunk[1]: 32
chunk[0]: 48
chunk[1]: 32
chunk[0]: 48
chunk[1]: 32
chunk[2]: 10
CONSTRUÍDO COM SUCESSO (tempo total: 6 segundos)

Mais estranho ainda é, se faco assim:
while(true)
        {  
            int available = input.available();
            
            byte chunk[] = new byte[available];   
            input.read(chunk, 0, available);

            for(int i = 0; i < chunk.length; i++)
		System.out.println("chunk["+i+"]: " + chunk[i]);

            //Recebe os valores de R G B   
            String colorString = new String(chunk);
    
            // Mostra o que foi obtido da conexao serial c/ Arduino     
            System.out.print(colorString);
}
recebo isso:
run: Using port: COM3 Using board: atmega328 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 chunk[0]: 48 chunk[1]: 32 0 chunk[0]: 48 chunk[1]: 32 0 chunk[0]: 48 chunk[1]: 32 chunk[2]: 10 0 chunk[0]: 48 chunk[1]: 32 0 chunk[0]: 48 chunk[1]: 32 0 chunk[0]: 48 chunk[1]: 32 chunk[2]: 10 0 CONSTRUÍDO COM SUCESSO (tempo total: 4 segundos)

Se comento o for, recebo os valores corretos:

run:
Using port: COM3
Using board: atmega328
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
48 32 47
0 0 0
109 31 21
0 0 0
0 0 0
CONSTRUÍDO COM SUCESSO (tempo total: 18 segundos)

VitaliBR

Consegui :D

while(true)
        {  
            int available = input.available();           
            byte chunk[] = new byte[available];   
            input.read(chunk, 0, available);

            for(byte b : chunk)
            {
                if(b == '\n' && !SerialData.isEmpty())
                {
                    String [] RGBValues = SerialData.split(" ");
                    
                    if(RGBValues.length != 3)
                            throw new Error("Receivde data could not be decoded");
                    
                    for(int i=0; i<3; i++)
                    {
                        RawColor[i] = Integer.parseInt(RGBValues[i]);
                        CalibratedColor[i] = Math.round(255.0f*(1024.0f-(float)RawColor[i])/(1024.0f-(float)CalibrationColor[i]));
                    }
                   
                    //correct values if outside range
						
                    if(CalibratedColor[RED]>255)		
                        CalibratedColor[RED]=255;
                    if(CalibratedColor[GREEN]>255)
			CalibratedColor[GREEN]=255;
                    if(CalibratedColor[BLUE]>255)
			CalibratedColor[BLUE]=255;

                    //displayColor();
                    System.out.println(Integer.toString(RawColor[RED]));
                    System.out.println(Integer.toString(RawColor[GREEN]));
                    System.out.println(Integer.toString(RawColor[BLUE]));
                               
						
                    SerialData="";
                }
		else
                    SerialData += (char) b;
            }
        }

E agora? coloco "resolvido" no topico?

[]'s

VitaliBR

Duplicou o post :shock:

WellingtonRamos

Liste a saída que está ocorrendo e a saída desejada para entendermos o que você quer dizer por “louco”. Isso ajuda a entendermos seu código :slight_smile:

Criado 12 de junho de 2011
Ultima resposta 13 de jun. de 2011
Respostas 19
Participantes 4