Me ajudem!

Como faço para criar uma variável tipo:

String Centímetro “CM” ;

Mas sem utilizar String?

Como assim sem usar String? Quer criar a variável sem declarar o tipo? Por que precisa disso?

Abraço.

Olá bem… eu queria utilizar tipo uma variável que faça a mesma coisa que o String tipo Char mas tem que ser de 1-4 letras ou mais.

Quero fazer uma calculadora que converta por exemplo metro para hectômetro…

Ai faço assim declaro
public static char S1;
public static char S2;
public static char a;
public static char Metro =‘M’ ;
public static char Hectometro =‘H’ ; //Quero declarar “HM” mas sem usar string.

E por que você não pode utilizar Strings?

Porque nao consigo fazer oque eu quero com elas

E o que é isso que queres fazer e não consegues?
Talvez se explicares o teu problema seja mais fácil de ajudar.

String serve exatamente pra isso. Se você quer todos os benefícios da classe String sem usar a classe String, vai ter que criar sua própria classe que faça a mesma coisa que String, e isso não é exatamente trivial.

Supondo que esse é o problema que você quer resolver, você precisa usar os tipos apropriados. Acho que a sua confusão é como separar o que é exibido pro usuário (valores com as devidas unidades) do que é usado internamente no programa (números).

Por exemplo, uma vez que a conversão que você quer é entre números que podem ter partes decimais, é mais coerente usar tipos como float ou double.

float numeroASerConvertido = 453f;

float numeroConvertidoParaHM = numeroASerConvertido / 100f; // 1HM = 100M

A exibição então é algo separado de tudo isso. Pode ser algo como:

System.out.println(new DecimalFormat("#.####").format(numeroConvertidoparaHM) + "HM");

PS: há outras formas de formatar a exibição, esse é um exemplo apenas.

Se você quer ter a possibilidade de fazer múltiplas conversões, pode ter uma lista das conversões suportadas, e os respectivos fatores de conversão, ou mesmo (se quiser algo mais complexo) criar classes auxiliares para cada tipo de conversão.

Abraço.

1 curtida

Cria sua própria classe para conversão de unidades.

Exemplo:

import unidades.Unidade;
import unidades.Unidade.Hectometro;
import unidades.Unidade.Metro;

public class Exemplo {

    public static void main(String[] args) {
        Metro m = Unidade.metro(50);
        Hectometro hm = m.toHectometro();
        System.out.printf("%s m equivalem à %s hm%n", m, hm);

        hm = Unidade.hectometro(25);
        m = hm.toMetro();
        System.out.printf("%s hm equivalem à %s m%n", hm, m);
    }
}

Saída do programa acima:

50.0 m equivalem à 0.5 hm
25.0 hm equivalem à 2500.0 m

Fonte da classe Unidade:

package unidades;

@SuppressWarnings("serial")
public abstract class Unidade extends Number {

    public static final class Hectometro extends Unidade {

        protected Hectometro(double valor) {
            super(valor);
        }

        @Override
        public Hectometro toHectometro() {
            return this;
        }

        @Override
        public Metro toMetro() {
            return new Metro(valor * 100.0);
        }
    }

    public static final class Metro extends Unidade {

        protected Metro(double valor) {
            super(valor);
        }

        @Override
        public Hectometro toHectometro() {
            return new Hectometro(valor / 100.0);
        }

        @Override
        public Metro toMetro() {
            return this;
        }

    }

    public static Hectometro hectometro(double valor) {
        return new Hectometro(valor);
    }

    public static Metro metro(double valor) {
        return new Metro(valor);
    }

    public final double valor;

    protected Unidade(double valor) {
        this.valor = valor;
    }

    @Override
    public double doubleValue() {
        return valor;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass().equals(this.getClass())) {
            Unidade that = (Unidade) obj;
            return Double.doubleToLongBits(this.valor) == Double.doubleToLongBits(that.valor);
        }
        return false;
    }

    @Override
    public float floatValue() {
        return (float) valor;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        long temp;
        temp = Double.doubleToLongBits(valor);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public int intValue() {
        return (int) valor;
    }

    @Override
    public long longValue() {
        return (long) valor;
    }

    public abstract Hectometro toHectometro();

    public abstract Metro toMetro();

    @Override
    public String toString() {
        return String.valueOf(valor);
    }
}

Podes usar uma enum e aproveitar o facto que as conversões são sempre em potências de 10

enum Unit {
    KM(-3),
    HM(-2),
    DAM(-1),
    M(0),
    DM(1),
    CM(2),
    MM(3);

    private int power;

    Unit(int power) {
        this.power = power;
    }

    public double convertTo(Unit otherUnit, double value) {
        return value * Math.pow(10, otherUnit.power - power);
    }
}

E aplicando:

public class Converter {

    public static void main(String[] args) {
        double m = 50;
        double hm = Unit.M.convertTo(Unit.HM, m);
        System.out.printf("%.2f m equivalem a %.2f hm%n", m, hm);

        hm = 50;
        m = Unit.HM.convertTo(Unit.M, hm);
        System.out.printf("%.2f hm equivalem a %.2f m%n", hm, m);
    }
}
3 curtidas