CustomValueComparator для Object.class не используется для значений MapJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 CustomValueComparator для Object.class не используется для значений Map

Сообщение Anonymous »

Я использую JaVers и пытаюсь применить CustomValueComparator к значениям внутри Map.
Я хочу сравнить все типы чисел, чтобы они были одинаковыми, если они численно похожи. если тип экземпляра не является числом, он будет просто сравнивать Object.equals().
Я вижу, что CustomValueComparator регистрируется. Однако метод равенства не подбирается, когда я выполняю отладку в методе равенства PrimitiveOrValueType. Я не вижу, чтобы valueCompartor присутствовал для ValueType для Object.class.
Я не могу сделать эту карту Map, поскольку могут быть и другие типы данных.
Ниже приведен код.
public class NumericComparator implements CustomValueComparator {

//Tolerance for numeric comparison - numbers within this difference are considered equal
private static final double TOLERANCE = 0.01;

@Override
public boolean equals(Object a, Object b) {
// Both null - equal
if (a == null && b == null) {
return true;
}

// One null - not equal
if (a == null || b == null) {
return false;
}

// Both are Numbers - apply tolerance comparison
if (a instanceof Number && b instanceof Number) {
return compareNumbersWithTolerance(a, b);
}

// Not both numbers - use standard Object equality
return a.equals(b);
}

public String toString(Object value) {
return value == null ? "null" : value.toString();
}

/**
* Compares two numbers for numeric equality with tolerance.
* Handles special cases like NaN and Infinity.
*
* @param a First number
* @param b Second number
* @return true if numerically equal within tolerance
*/
private boolean compareNumbersWithTolerance(Object a, Object b) {
// Cast to Number since this method is only called when both are instanceof Number
Number numA = (Number) a;
Number numB = (Number) b;

// Handle special floating point values
if (isSpecialFloatingPoint(numA) || isSpecialFloatingPoint(numB)) {
return handleSpecialFloatingPoint(numA, numB);
}

// Convert both to BigDecimal for precise comparison
try {
BigDecimal bdA = toBigDecimal(numA);
BigDecimal bdB = toBigDecimal(numB);

// Calculate absolute difference
BigDecimal difference = bdA.subtract(bdB).abs();
BigDecimal toleranceBD = BigDecimal.valueOf(TOLERANCE);

// Compare: |a - b|

Подробнее здесь: https://stackoverflow.com/questions/798 ... ect-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»