Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Численное сравнение объектов - потомков класса java.lang.Number: как ? / 7 сообщений из 7, страница 1 из 1
10.10.2013, 20:34:21
    #38423580
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
Прямыми потомками класса Number, согласно доке, являются: BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short.
Содержимое этих классов есть всегда только числа, т.е. можно сравнивать именно их абсолютные величины.

Опять туплю: как это сделать в java ? Непосредственно сравнить Integer & Long нельзя - обломится на компиляции.
Решил объехать через вызов метода в передачей ему Number-объектов - а фиг:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import java.math.*;
class NumsComparison {
  static {
    Integer a = 0;
    Long b = 0L;

    BigInteger n = new BigInteger("123456");
    BigDecimal m = new BigDecimal("123456");

    System.out.println( numCmp(a, b) );
    System.out.println( numCmp(n, m) );
    System.exit(0);
  }
  private static boolean numCmp(Number x, Number y) {
    return x.equals(y);
    // -!- return x.compareTo(y);
  }
}

- выдаёт false + false.
Тогда как сравнивать-то ?
...
Рейтинг: 0 / 0
10.10.2013, 20:43:51
    #38423593
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
Number нельзя сравнивать, так как они не реализуют Comparable. Все, что вы можете сделать, это вызвать на Number какой-нибудь публичный метод вроде intValue(), и сравнить вернувшиеся значения.
...
Рейтинг: 0 / 0
10.10.2013, 21:14:58
    #38423622
Мужик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
А не реализуют они интерфейс Comparable, потому что он задает отношение полного порядка, а такой порядок возможен не на всех Number. Например, на числах с плавающей запятой нет отношения полного порядка (NaN не меньше, не больше, и не равен никакому другому числу, и даже не равен самому себе). Более того, существуют mutable Numbers (например, AtomicInteger), для которых отношение порядка задавать дурной тон.
...
Рейтинг: 0 / 0
10.10.2013, 21:25:27
    #38423633
Мужик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
А еще есть комплексные числа, для которых отношение порядка можно задавать по-разному.

Если предположить, что все числа вещественные, то самое простое так (видимо еще нужна обработка специальных значений типа Nan, +0, -0, infinity и т.п.)
Код: java
1.
2.
3.
4.
5.
public class NumberComparator implements Comparator<Number> {
    public int compare(Number n, Number m) {
        return new BigDecimal(n.toString()).compareTo(new BigDecimal(m.toString()));
    }
}
...
Рейтинг: 0 / 0
11.10.2013, 13:13:24
    #38424360
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
cdtyjvNumber нельзя сравнивать, так как они не реализуют Comparable. Все, что вы можете сделать, это вызвать на Number какой-нибудь публичный метод вроде intValue(), и сравнить вернувшиеся значения.

Здравствуй, великолепный очень-высокоуровневый объектноориентированный язык Java!

В общем, я бы написал на Reflection некую функцию, которая бы брала типы данных обоих аргументов,
пары, и, анализируя их, выбирала бы нужный способ сравнения.

Когда типы одинаковы, всё понятно более менее.
Когда разные -- надо преобразовывать к "старшему" типу и сравнивать их значения.
...
Рейтинг: 0 / 0
11.10.2013, 13:14:24
    #38424365
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
МужикА не реализуют они интерфейс Comparable, потому что он задает отношение полного порядка, а такой порядок возможен не на всех Number. Например, на числах с плавающей запятой нет отношения полного порядка (NaN не меньше, не больше, и не равен никакому другому числу, и даже не равен самому себе). Более того, существуют mutable Numbers (например, AtomicInteger), для которых отношение порядка задавать дурной тон.

Ага, а исключение бросать в этом случае -- не ? Не додуматься было ?
...
Рейтинг: 0 / 0
11.10.2013, 13:15:39
    #38424371
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Численное сравнение объектов - потомков класса java.lang.Number: как ?
МужикА еще есть комплексные числа, для которых отношение порядка можно задавать по-разному.


Как говорится, желание -- это тысяча способов, а нежелание -- тысяча причин.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Численное сравнение объектов - потомков класса java.lang.Number: как ? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]