Напишите конструктор из класса, который возвращает 2 значения - PullRequest
1 голос
/ 04 апреля 2019

У меня есть класс, который разделяет двойную часть на целую и дробную часть. Я хочу использовать их отдельно, когда создаю объект из этого класса.

Я пробовал это как функцию, но у функции есть только 1 возвращаемое значение, или я могу сделать это как возвращаемый массив, я знаю это. Мне просто интересно, смогу ли я сделать это как-нибудь более элегантно

Конструктор класса

    public wholeAndFraction(double db){
    String st=""+db;
    st=st.replace(".", "-");
    String[] str=st.split("-");
    int whole=Integer.parseInt(str[0]);
    int fraction=Integer.parseInt(str[1]);}

Когда я генерирую объект, я хочу пригласить целую или дробную часть, как

    wholeAndFraction first=new wholeAndFraction(5.32);
    System.out.println(first.whole);

или с геттером, но это также дает мне ошибку

Ответы [ 6 ]

1 голос
/ 04 апреля 2019

Вам нужен класс:

class WholeAndFraction {
    long whole;    // or String I do not know
    long fraction; // or String I do not know

    // constructor, getters
}

и передать экземпляр этого класса.

Нет способа вернуть 2 значения из метода. Вы можете вернуть список или массив с 2 значениями в нем, но это спорно, если это более изящным или нет ..

0 голосов
/ 04 апреля 2019

Существует множество проблем, с которыми вы можете столкнуться при использовании подобного подхода, но если вам абсолютно необходимо сделать это, вот решение для некоторых из них, проверьте комментарии для получения дополнительной информации.Если вам нужно только узнать, было ли число отрицательным, вы можете сделать что-то подобное, но это полностью зависит от вашего варианта использования.Использование целых чисел также является плохой идеей, потому что если двойное число достаточно велико, оно не подойдет ...

public class WholeAndFraction {

    // You have to use String because numbers like this exists:
    // 1123.0001020
    // 141.07 <- this would become an octal number
    // 6,9   6,09  <- these would give you the same value with doubles
    private boolean negative;
    private String whole;
    private String fraction;

    public WholeAndFraction(Double number){
        String numberAsString = String.valueOf(number);
        if (numberAsString.startsWith("-")){
            this.negative = true;
            numberAsString = numberAsString.replaceFirst("-", "");
        }

        // Based on Locale you can have . or , as separator
        String[] splitted = numberAsString.split("[\\.,]");
        this.whole = splitted[0];
        this.fraction = splitted[1];
    }

    // getters, setters, toString etc... or just use Lombok to generate it for you
}
0 голосов
/ 04 апреля 2019

Вы также можете пропустить st=st.replace(".", "-");, используя String[] str=st.split("\\.");

0 голосов
/ 04 апреля 2019

Используйте класс, как показано ниже:

class WholeAndFraction {
    int whole;
    int fraction;

    // constructor & getters
}

Кроме того, на отдельном примечании способ извлечения всей и десятичной части из двойного не элегантен и не соответствует тому, что вы написали.Это может быть переписано как:

public WholeAndFraction extractParts(double db) {
    WholeAndFraction  obj = new WholeAndFraction();
    BigDecimal bigDecimal = new BigDecimal(String.valueOf(db));
    obj.whole = bigDecimal.intValue();
    obj.fraction = Integer.parseInt(bigDecimal.subtract(new BigDecimal(obj.whole)).toPlainString().substring(2));
    return obj;
}
0 голосов
/ 04 апреля 2019

Конструктор присваивает переменным метода (которые исчезают после завершения конструктора), когда присваивания должны быть переменными экземпляра (которые будут доступны для методов получения).

Попробуйте изменить:

public wholeAndFraction(double db) {
    String st= "" + db;
    st=st.replace(".", "-");
    String[] str=st.split("-");
    int whole=Integer.parseInt(str[0]);
    int fraction=Integer.parseInt(str[1]);
}

К

public class WholeAndFraction {
    private final int whole;
    public int getWhole() { return whole; }

    private final int fraction;
    public int getFraction() { return fraction; }

    public WholeAndFraction(double db){
        String st=""+db;
        st=st.replace(".", "-");
        String[] str=st.split("-");
        this.whole=Integer.parseInt(str[0]);
        this.fraction=Integer.parseInt(str[1]);
    }
}

Я уточнил переменные экземпляра в выражениях присваивания, но это для ясности.

Это основная первая проблема.Существуют и другие проблемы, например, использование «-» прекратится, если число будет отрицательным."."не будет присутствовать, если номер уже является целым числом.И дробная часть, в том виде, в котором она реализована, не охватывает все детали десятичной части значения.Используя приведенный выше код, «1.02» и «1.0002» имеют одинаковую дробную часть.

0 голосов
/ 04 апреля 2019

Эти две строки в вашем конструкторе объявляют локальные переменные:

int whole=Integer.parseInt(str[0]);
int fraction=Integer.parseInt(str[1]);

Они существуют только внутри самого конструктора.

Вам необходимо объявить whole и fraction членами класса (как показано в другом ответе). В конструкторе вы удалили бы типы данных, которые указывают объявление переменной:

whole=Integer.parseInt(str[0]);
fraction=Integer.parseInt(str[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...