Compare prices taking into consideration units (kg, g)

3

Hello, I need to compare 2 products, taking into account their weight and values, to know which product is most advantageous to buy.

Ex: Rice 5kg - $ 10.00 Rice 2kg - $ 6.00

Thinking you can compare grams with kg by doing the right conversion. I am a beginner in programming for Android and I will be very grateful for the help.

The layout part I already understand well, I really need is the part of MainActivity. In the image shows more or less how will be in the end.

I'm not sure how to do this calculation. How do I check if the chosen unit is 'g' or 'kg', 'l', 'ml' and how to do the calculation based on the conversion

Myactivityislikethisatthemoment,rememberingthatI'mstartinginmobiledevelopmentandI'mreallyenjoyingit.

publicclassMainActivityextendsActionBarActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonb=(Button)findViewById(R.id.b);b.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewv){//unidadesSpinnerpeso1=(Spinner)findViewById(R.id.spinner1);Spinnerpeso2=(Spinner)findViewById(R.id.spinner2);//quantidadeemunidadesEditTextqtd1=(EditText)findViewById(R.id.qtd1);EditTextqtd2=(EditText)findViewById(R.id.qtd2);//valordoprodutoEditTextvalor1=(EditText)findViewById(R.id.valor1);EditTextvalor2=(EditText)findViewById(R.id.valor2);Doubleresultado1;Doubleresultado2;Doublevlr1=Double.parseDouble(valor1.getText().toString());Doublevlr2=Double.parseDouble(valor2.getText().toString());Integerquantidade1=Integer.parseInt(qtd1.getText().toString());Integerquantidade2=Integer.parseInt(qtd2.getText().toString());//devefazerasconversãoparaocálculoif(peso1.getSelectedItem().toString().equals("g"){
                quantidade1 = quantidade1 * 0.001; //converte pra kg

            }
            if (peso2.getSelectedItem().toString().equals("g"){
                quantidade2 = quantidade2 * 0.001;/ //converte pra kg

            }

            resultado1 = quantidade1 * vlr1;
            resultado2 = quantidade2 * vlr2;


            if (quantidade1 > quantidade2 || resultado1 < resultado2) {

                Toast.makeText(getApplicationContext(), "Compre o produto tal", Toast.LENGTH_SHORT).show();

            }
            else if (quantidade1 < quantidade2 || resultado1 > resultado2) {

                Toast.makeText(getApplicationContext(), "Compre o produto tal", Toast.LENGTH_SHORT).show();
            }
            else{
                 Toast.makeText(getApplicationContext(), "A vantagem dos produtos é a mesma", Toast.LENGTH_SHORT).show();
            }
            if (quantidade1 == quantidade2){
                Toast.makeText(getApplicationContext(), "Mesma quantidade", Toast.LENGTH_SHORT).show();
            }

        }
    });

}

}

    
asked by anonymous 10.06.2014 / 02:22

1 answer

7

You can do this using an object-oriented approach to encapsulate the complexity of these accounts.

Building a Product Template

First you can create a Enum for each measurement scale.

For example, for weight:

public enum UnidadePeso implements UnidadeProporcional {
    Grama(1), Kilograma(1000), Tonelada(1000000);

    private int proporcao;

    private UnidadePeso(int proporcao) {
        this.proporcao = proporcao;
    }

    @Override
    public int proporcao() {
        return proporcao;
    }
}

And for Volume:

public enum UnidadeVolume implements UnidadeProporcional {
    Mililitro(1), Litro(1000);

    private int proporcao;

    private UnidadeVolume(int proporcao) {
        this.proporcao = proporcao;
    }

    @Override
    public int proporcao() {
        return proporcao;
    }
}

The interface UnidadeProporcional serves to generalize the proporcao() method:

public interface UnidadeProporcional {

    int proporcao();

}

Finally, here is a generic class of Produto that receives the unit value, the quantity and the unit of measure and allows the comparison between:

public class Produto<T extends UnidadeProporcional> implements Comparable<Produto<T>> {

    private BigDecimal preco;
    private int quantidade;
    private T unidade;

    public Produto(BigDecimal preco, int quantidade, T unidade) {
        if (preco == null) {
            throw new IllegalArgumentException("Preço nulo!");
        }
        if (quantidade <= 0) {
            throw new IllegalArgumentException("Quantidade deve ser um inteiro positivo!");
        }
        if (unidade == null) {
            throw new IllegalArgumentException("Informe a unidade!");
        }
        this.preco = preco;
        this.quantidade = quantidade;
        this.unidade = unidade;
    }

    public BigDecimal getPreco() {
        return preco;
    }

    /**
     * Retorna o preço na unidade básica para possibilitar a comparação em unidades diferentes.
     * Por exemplo, se a unidade for kg, o "preço base" será dividido por 1000, ou seja, o valor em gramas do produto.
     * Além disso, o resultado também será dividido pela quantidade, de forma que o resultado seja o valor por grama. 
     */
    public BigDecimal getPrecoBase() {
        return preco.divide(new BigDecimal(unidade.proporcao())).divide(new BigDecimal(quantidade));
    }

    public int getQuantidade() {
        return quantidade;
    }

    public T getUnidade() {
        return unidade;
    }

    @Override
    public int compareTo(Produto<T> o) {
        if (o == null) {
            throw new IllegalArgumentException("Objeto nulo!");
        }
        return this.getPrecoBase().compareTo(o.getPrecoBase());
    }

}

The getPrecoBase() method does the "magic", returning the price of the product in the basic unit of the scale.

For example, if the product unit is Kg and quantity 2, it divides the value by 1000 to transform the unit into grams and dpeois by 2 to get the value of one gram.

So, it normalizes the values to enable comparison.

Example usage

With the template built, you can simply create two products and compare them:

Produto<UnidadePeso> laranjaExtra = new Produto<UnidadePeso>(
    new BigDecimal("50"), 1, UnidadePeso.Kilograma);

Produto<UnidadePeso> laranjaCarrefour = new Produto<UnidadePeso>(
    new BigDecimal("49.95"), 1000, UnidadePeso.Grama);

int resultado = laranjaExtra.compareTo(laranjaCarrefour);

If you have compared objects in Java with the compareTo method, you should know that a 0 return means that the values are equal, 1 , that the first is greater than the second, and -1 to the contrary.

The above code will return 1 because the value per gram of orange in the Extra will be R$ 0,05 , while in Carrefour it will be R$ 0,04995 .

Improve my code

You can download or clone the project with the above code in my Github .

You can increment it, for example, to receive a quantity of type BigDecimal , since the user can enter 1,5 liters or kilograms.

    
12.06.2014 / 18:29