Passar ArrayList "0" para um metodo

12 respostas
rafael.luc

Estou com o seguinte problema, preciso enviar uma ArrayList de um boolean em determinada situação para um método, em outra situação apenas um valor INT.

Aqui um codico simplificado da minha questão:

protected void Exemplo() {

if (funcao <= 2){

                           MicroAsciiSerialPointLocatorVO dataPointVO = dataPoint.getVO().getPointLocator();

                           List<Boolean>valuesBinary = new ArrayList<Boolean>();

                           for (DataPointRT dp : dataPoints) {
								
	                                    boolean value = ((MicroAsciiSerialPointLocatorRT) dp.getPointLocator()).getVO().getValue();
										
                                        if (!valuesBinary.contains(value))
                                                valuesBinary.add(value);
     	                                }
} else {
              int valueInt = dataPointVO.getValue()
          }

MicroAsciiSerialRequest req = new MicroAsciiSerialRequest();

req.ProcVar(Funcao, ???, ???); // passar a ArrayList ou valor inteiro de acordo a funcao.

Método em outra classe

public String ProcVar( int Funcao, ???, ???) {// receber ArrayList ou valor inteiro

// codico
}

Se eu não passar um os dois valores, dará erro em uma das variáveis. Eu teria que enviar a ArrayList com valor zero, como faco isso?

12 Respostas

yhhik

se só precisa de um dos parâmetros passados faça uma sobrecarga.
mas se vc precisa realmente passar a lista passe ela nula.

Vingdel

Faça dois métodos, um que recebe int e outro que recebe ArrayList. Métodos sobrecarregados, como o amigo yhhik disse.

Abraço!

rafael.luc

Se passar como null da erro, por isso abri o tópico. Na verdade tenho que passar umas 8 variáveis para o método, não sei se vou conseguir separar em dois métodos. Ja que tenho uma logica comum no final do método.

yhhik

para isso que serve a sobrecarga…crie quantos quiser.
flw

rafael.luc

Entendi o que é a sobrecarga, mas não sei a melhor maneira de separar o meu método. O que é passado para método são 7 variáveis e um Case com 5 opções de acordo com a função que me retorna um codico, esse codico é processado (PosCodico) e seria onde tenho o resultado do método, por isso fiz tudo em um método apenas. Se eu separar vou ter repetir a logica do PosCode?

Lucas_Abbatepaolo

Você precisa passar sempre uma ou outra ou seu metodo depende das duas variaveis…

Se for em alguns momentos o int e em outras o arrayList, sobrecarga seria uma boa opção…porem não tem sentido vc repetir o conteudo do metodo.

Veja se não é possivel separar a logica…

Vingdel

rafael.luc, boa tarde!

Amigão, posta teu método completinho aqui para nós darmos uma olhada e guiarmos a ti na melhor forma de resolver, vai ser mais fácil.

Abração!

rafael.luc
Aqui esta:
public class MicroAsciiSerialMaster {

	static String codeFunc1, codeFunc4, codeFunc5;
	boolean enableWrite = true;
	String PosCode;

	public String ProcVar(int reqSlaveId, int reqFunctionMode,
			int reqTagUnit, int reqValue, boolean reqAccessRw,
			boolean[] reqValuesBinary, int reqValueInt) {

		String code = "";
		int cont = 1;
		int valueOut = 0;

		// Start of group tags and some of values binary
		if (reqFunctionMode <= 2) {

			while (reqTagUnit > 8) {
				cont = cont + 1;
				reqTagUnit = reqTagUnit - 8;
			}

			if (reqAccessRw == true) {
				int a = 8 * (cont - 1);
				int b = 8 + a;
				int i = 0;
				for (boolean s : reqValuesBinary) {
					if (i >= a && i < b) {
						if (s == true) {
							valueOut = valueOut + (int) Math.pow(2, (i - a));
						}
					}
					i++;
				}
			}
		}
		// End

		switch (reqFunctionMode) {

		case 1:

			if (reqAccessRw == true) {

				code = reqSlaveId + "1" + String.format("%02d", cont) + "1"
						+ String.format("%03d", valueOut);

				if (!code.equals(codeFunc1)) {

					codeFunc1 = code;

				} else {
					enableWrite = false;
				}

			} else {
				code = reqSlaveId + "1" + String.format("%02d", cont) + "0000";
			}
			break;

		case 2:

			code = reqSlaveId + "2" + String.format("%02d", cont) + "0000";

			break;

		case 3:

			code = reqSlaveId + "3" + String.format("%02d", reqTagUnit)
					+ "0000";

			break;

		case 4:

			if (reqAccessRw == true) {

				code = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
						+ "1" + String.format("%03d", reqValueInt);

				if (!code.equals(codeFunc4)) {

					codeFunc4 = code;

				} else {
					enableWrite = false;
				}

			} else {
				code = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
						+ "0000";
			}
			break;

		case 5:

			if (reqAccessRw == true) {

				code = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
						+ "1" + String.format("%03d", reqValueInt);

				if (!code.equals(codeFunc5)) {

					codeFunc5 = code;

				} else {
					enableWrite = false;
				}

			} else {
				code = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
						+ "0000";
			}
			break;

		}

		// Start CheckSum
		int someCheckSum = 0;
		byte bytesCheckSum[] = code.getBytes();

		for (int i = 0; i < code.length(); i++) {
			someCheckSum = someCheckSum + (bytesCheckSum[i] - 48);
		}
		// End

		PosCode = code + String.format("%02d", someCheckSum);

		return PosCode;

	}

}

A logica CheckSun tem apenas 4 linhas, poderia repeti-lo, mas estou vendo a melhor forma de resolver, ao meu ver seria 3 metodos. Um com com ArrayList outro com valor Int e outro com CheckSun.

rafael.luc

Resolvi da seguinte forma, apenas não sei se foi a melhor.

package rt;

import java.util.List;

public class MicroAsciiSerialRequest {

	String preCode, posCode;
	static String codeFunc1, codeFunc4, codeFunc5;
	boolean enableWrite = true;
	
	public String ProcVar(int reqSlaveId, int reqFunctionMode, int reqTagUnit,
			boolean reqAccessRw, List <Boolean> reqValuesBinary) {

		int contTags = 1;
		int valueByte = 0;

		while (reqTagUnit > 8) {
			contTags = contTags + 1;
			reqTagUnit = reqTagUnit - 8;
		}

		if (reqFunctionMode == 1) {

			if (reqAccessRw == true) {
				int a = 8 * (contTags - 1);
				int b = 8 + a;
				int i = 0;

				for (boolean s : reqValuesBinary) {
					if (i >= a && i < b) {
						if (s == true) {
							valueByte = valueByte + (int) Math.pow(2, (i - a));
						}
					}
					i++;
				}

				preCode = reqSlaveId + "1" + String.format("%02d", contTags)
						+ "1" + String.format("%03d", valueByte);

				if (!preCode.equals(codeFunc1)) {

					codeFunc1 = preCode;

				} else {
					enableWrite = false;
				}

			} else {
				preCode = reqSlaveId + "1" + String.format("%02d", contTags)
						+ "0000";
			}
		}

		if (reqFunctionMode == 2) {

			preCode = reqSlaveId + "2" + String.format("%02d", contTags)
					+ "0000";

		}
		
		int someCheckSum = 0;
		byte bytesCheckSum[] = preCode.getBytes();

		for (int i = 0; i < preCode.length(); i++) {
			someCheckSum = someCheckSum + (bytesCheckSum[i] - 48);
		}

		posCode = preCode + String.format("%02d", someCheckSum);

		return posCode;
	}

	public String ProcVar(int reqSlaveId, int reqFunctionMode, int reqTagUnit,
			boolean reqAccessRw, int reqValueByte) {

		switch (reqFunctionMode) {

		case 3:

			preCode = reqSlaveId + "3" + String.format("%02d", reqTagUnit)
					+ "0000";

			break;

		case 4:

			if (reqAccessRw == true) {

				preCode = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
						+ "1" + String.format("%03d", reqValueByte);

				if (!preCode.equals(codeFunc4)) {

					codeFunc4 = preCode;

				} else {
					enableWrite = false;
				}

			} else {
				preCode = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
						+ "0000";
			}
			break;

		case 5:

			if (reqAccessRw == true) {

				preCode = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
						+ "1" + String.format("%03d", reqValueByte);

				if (!preCode.equals(codeFunc5)) {

					codeFunc5 = preCode;

				} else {
					enableWrite = false;
				}

			} else {
				preCode = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
						+ "0000";
			}
			break;

		}
		int someCheckSum = 0;
		byte bytesCheckSum[] = preCode.getBytes();

		for (int i = 0; i < preCode.length(); i++) {
			someCheckSum = someCheckSum + (bytesCheckSum[i] - 48);
		}

		posCode = preCode + String.format("%02d", someCheckSum);

		return posCode;
	}
}
Vingdel

rafael.luc, bom dia!

Pelo que pude ver, o método ProcVar não recebe um ArrayList, mas sim um Array do tipo boolean em um de seu argumentos. Não será essa a confusão?

Fiz uns testes aqui e o método funciona perfeitamente. Veja:
public class Modelo {

	public static void main (String[] args) {
		boolean[] valoresBin = {true, false, true, true};
		
		MicroAsciiSerialMaster masm = new MicroAsciiSerialMaster();

		System.out.println( masm.ProcVar(20, 1, 71, 11, true, valoresBin, 9) );

	}
}
Saída:
[telefone removido]
Caso o Array não tenha um número de índices prédefinido, você pode usar um ArrayList, sim, porém antes de passar ao método é só converter para um Array. Veja um exemplo:
import java.util.ArrayList;

public class Modelo { 

	public static void main (String[] args) {
		// boolean[] valoresBin = {true, false, true, true};

		ArrayList<Boolean> listBin = new ArrayList<Boolean>();
		listBin.add(true);
		listBin.add(false);
		listBin.add(true);
		listBin.add(true);

		// Converte a ArrayList<Boolean> em boolean[] (primitivo)
		boolean[] valoresBin = new boolean[listBin.size()];

		for(int i = 0; i < valoresBin.length; i++)
			valoresBin[i] = listBin.get(i).booleanValue();
		
		MicroAsciiSerialMaster masm = new MicroAsciiSerialMaster();

		System.out.println( masm.ProcVar(20, 1, 71, 11, true, valoresBin, 9) );
	}
}
Tem o mesmo resultado. Espero que isso te ajude.

Abraço e boa sorte!

rafael.luc

Aqui esta meu codico de teste para o envio

public class MicroAsciiSerialDataSource {

	int porta = 1;
	Vo vo = new Vo();
	MicroAsciiSerialRequest request = new MicroAsciiSerialRequest();
	
	protected void doPoll() {
		vo.Valores();
		for (int i = 0; i < 2; i++){ // para teste "repetido"
			
		if (porta == 1) {
                // Como vai ser no programa

               // for (DataPointRT dataPoint : dataPoints) {
				
					   // MicroAsciiSerialPointLocatorVO dataPointVO = dataPoint.getVO().getPointLocator();
					
					  //  if (dataPointVO.getFunctionMode() =< 2){
						
					          //  List<Boolean>valuesBinary = new ArrayList<Boolean>();
					
					           // for (DataPointRT dp : dataPoints) {
								
	                                   // boolean bit = ((MicroAsciiSerialPointLocatorRT) dp.getPointLocator()).getVO().getValue();
										
                                       // if (!valuesBinary.contains(bit))
                                              //  valuesBinary.add(bit);
     	                              //  }

                     // Fim do programa real

		 List<Boolean> valuesBinary = new ArrayList<Boolean>();
		    for(boolean bit: vo.valueBit){
			    boolean value = bit;
			    valuesBinary.add(value);
		    }
            
			if (vo.getFunctionMode() <= 2){
			request.ProcVar(vo.getSlaveId(), vo.getFunctionMode(),
					vo.getTagUnit(), vo.isAccessRw(), valuesBinary);
			}else{
				request.ProcVar(vo.getSlaveId(), vo.getFunctionMode(),
						vo.getTagUnit(), vo.isAccessRw(), vo.valueByte);
			}

			if (request.enableWrite == true) {
				System.out.println(request.posCode);

			} else {
				System.out.println("repetido"); // para teste

			}

@Vingdel, eu não entendi bem o que disse, depois vejo com mais atenção. Para testar meu codico seria:

Slave: 1-9
funcao: 1-5
Tag: 1-99

valor 0-255

Se reparar eu passo o valor de 8 bits para um byte que forma um valor Int, isso é para passar 8 valores em um único codico, ou seja em bloco.
Nesse meu tópico tem mais informação( ou desinformação hehehe):

http://www.guj.com.br/java/261908-duvida-com-um-metodo-usando-for-each#1368538

Vingdel

A minha resposta foi baseada no primeiro exemplo de código que você deu, a sua postagem com a alteração foi feita enquanto eu estava escrevendo a minha e não a tinha visto.

Seu problema está resolvido?

Abraço!

Criado 4 de janeiro de 2012
Ultima resposta 6 de jan. de 2012
Respostas 12
Participantes 4