Boa tarde, tenho um problema que não estou conseguindo resolver que é retornar um array de objeto que exigi alguns parâmetros. Segue abaixo o método e a chamada no main:
//Método que retorna um array de objeto do tipo Imovel
public Imovel[] consultarPorTipoCidadeAreaPreco(int tipo, String cidade, double area, double preco){
Imovel[] casa = new Imovel[100];
boolean validar = true;
for(int i=0; i < qtdaImoveis; i++){
if(tipo == imoveis[i].getTipo() && imoveis[i].equals(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){
casa[contador] = imoveis[i];
contador++;
}
else{
casa[contador] = null;
}
}
if(validar == false){
casa = null;
JOptionPane.showMessageDialog(null, "Não existem imóvel com essas características!!!");
}
return casa;
}
//Trecho do código que solicita os parâmetros e imprimi os imóveis encontrados na tela.
//main
//consultar por tipo, cidade, area e preco
case 2:{
tipo = Integer.parseInt(JOptionPane.showInputDialog("Tipo do Imóvel:\n\n(1) Residencial\n(2) Comercial\n(3) Rural\n\n"));
cidade = JOptionPane.showInputDialog("Cidade do Imóvel");
area = Double.parseDouble(JOptionPane.showInputDialog("Área do Imóvel:"));
preco = Double.parseDouble(JOptionPane.showInputDialog("Preço do Imóvel:"));
Imovel[] imoveis = cad.consultarPorTipoCidadeAreaPreco(tipo, cidade, area, preco); //Aqui utiliza o método que busca os imóveis com as características informadas
for(int i=0; i < cad.getContador(); i++){ //Concatena as informações dos imóveis encontrados na String saida
saida += imoveis[i].getDescricao()+"\t"+imoveis[i].getTipo()+"" +
"\t"+imoveis[i].getCidade()+"\t"+imoveis[i].getBairro()+"" +
"\t"+imoveis[i].getArea()+"\t"+imoveis[i].getPreco()+"\n";
}
outputArea.setText(saida); //Apresenta na tela os imóveis encontrados
JOptionPane.showMessageDialog(null, scroller, "Imóvel Cadastrado", JOptionPane.PLAIN_MESSAGE);//Conforme este código a tela aparece em branco
}break;
Outra dicazinha: mesmo que você queira retornar um array de alguma coisa (normalmente porque você não pode mexer na interface, ou seja, na declaração do método), trabalhe internamente com ArrayList. Você pode ver esse truque sendo usado em várias classes do próprio JDK.
Trabalhar internamente com ArrayList, e retornar um array exatamente com o tamanho certo dos seus dados, tem 3 vantagens:
a) Você não tem o limite de 100 que você impôs arbitrariamente no seu código.
b) O programa que recebe o array não precisa checar se as posições são null.
c) Não precisa ficar controlando contadores e outras coisas (talvez corretores também sejam difíceis de lidar, não?)
Vou dar um exemplo. Digamos que você queira declarar um método assim:
Imovel[] consultarImoveisQuartosPrecoBairro(int quartos, double precoMinimo, double precoMaximo, String bairro) {
List<Imovel> imoveis = new ArrayList<Imovel>();
// preencha sua lista de imoveis - para adicionar um novo valor, use imoveis.add (new Imovel (....
// e por fim, para obter o array de retorno:
return imoveis.toArray(new Imovel[0]); // truque - esse new Imovel[0] serve só para o método toArray saber
// exatamente o tipo do array a ser retornado e será descartado depois do uso.
}
Ola romarcio muito obrigado pelas observações, ajudou bastante, fiz algumas alterações e atingi um dos objetivos, que foi: localizar os imóveis com as características informadas. Portanto, o objetivo de informar quando nenhuma imóvel tem as respectivas características não foi atingido, que verificar se o objeto seria null, o que não estou conseguindo.
Modificações realizadas:
public Imovel[] consultarPorTipoCidadeAreaPreco(int tipo, String cidade, double area, double preco){
Imovel[] casa = new Imovel[100];
int indice = 0;
for(int i=0; i < qtdaImoveis; i++){
if(tipo == imoveis[i].getTipo() && imoveis[i].getCidade().equalsIgnoreCase(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){
casa[indice] = imoveis[i];
indice++;
}
}
contador = indice;
return casa;
}
No main:
case 2:{
tipo = Integer.parseInt(JOptionPane.showInputDialog("Tipo do Imóvel:\n\n(1) Residencial\n(2) Comercial\n(3) Rural\n\n"));
cidade = JOptionPane.showInputDialog("Cidade do Imóvel");
area = Double.parseDouble(JOptionPane.showInputDialog("Área do Imóvel:"));
preco = Double.parseDouble(JOptionPane.showInputDialog("Preço do Imóvel:"));
String saida = "Descricao\tTipo\tCidade\tBairro\tÁrea\tPreço\n";
Imovel[] imoveis = cad.consultarPorTipoCidadeAreaPreco(tipo, cidade, area, preco);
if(imoveis == null){//Esta condição não está funcionando
JOptionPane.showMessageDialog(null, "Não foi localizado nenhum imóvel com estas características!!!", "Mensagem", JOptionPane.ERROR_MESSAGE);
}else{
for(int i=0; i < cad.getContador(); i++){
saida += imoveis[i].getDescricao()+"\t"+imoveis[i].getTipo()+"" +
"\t"+imoveis[i].getCidade()+"\t"+imoveis[i].getBairro()+"" +
"\t"+imoveis[i].getArea()+"\t"+imoveis[i].getPreco()+"\n";
}
outputArea.setText(saida);
JOptionPane.showMessageDialog(null, scroller, "Imóvel Cadastrado", JOptionPane.PLAIN_MESSAGE);
}
}break;