Сравнение JavaBeans

Кто-нибудь знает о бесплатной библиотеке с открытым исходным кодом (служебный класс), которая позволяет сравнивать два экземпляра одного Java-компонента и возвращать список / массив свойств, значения которых в этих двух экземплярах различаются? Пожалуйста, разместите небольшой образец.

Ура Томас

Здесь есть несколько хороших ответов: stackoverflow.com/questions/472626/…

Bampfer 27.01.2016 22:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
1
7 697
2

Ответы 2

BeanComparator общего пользования Apache - это то, что вы ищете.

Обновлять. Простой пример, сравнивающий JavaBeans с одним свойством (сравнение выполняется только с одним свойством, вы должны создать столько BeanComparators, сколько свойств, которые вы хотите сопоставить).

import org.apache.commons.beanutils.BeanComparator;

public class TestBeanComparator
{
    public TestBeanComparator()
    {
    }

    public class TestBean
    {
        int value;

        public TestBean()
        {
        }

        public int getValue()
        {
            return value;
        }

        public void setValue(int value)
        {
            this.value = value;
        }
    }

    public static void main(String[] args)
    {
        TestBeanComparator tbc = new TestBeanComparator();

        tbc.go();
    }

    public void go()
    {
        TestBean tbs [] = new TestBean[10];

        for (int i = 0; i < tbs.length; i++)
        {
            tbs[i] = new TestBeanComparator.TestBean();
            tbs[i].setValue((int) (Math.random() * 10));

            System.out.println("TestBean["+i+"] = " + tbs[i].getValue());
        }

        BeanComparator bc = new BeanComparator("value");

        System.out.println("");
        System.out.println("Value to match: " + tbs[0].getValue());
        for (int i = 1; i < tbs.length; i++)
        {
            if (bc.compare(tbs[i], tbs[0]) == 0)
            {
               System.out.println("Match found in bean "+ i); 
            }
        }
    }
}

После нескольких тестов один результат положительный. Это результат:

TestBean[0] = 0
TestBean[1] = 4
TestBean[2] = 0
TestBean[3] = 2
TestBean[4] = 7
TestBean[5] = 3
TestBean[6] = 0
TestBean[7] = 3
TestBean[8] = 7
TestBean[9] = 3

Value to match: 0
Match found in bean 2
Match found in bean 6

Очевидно, что увеличение размера массива TestBean увеличит шансы на получение совпадений.

Вам необходимо импортировать в свой проект следующие jar-файлы: commons-logging-версия.jar, commons-beanutils-версия.jar, commons-beanutils-core-версия.jar, commons-beanutils-bean-collections-RR_9_Rons.jar. -collections-версия.jar.

Файлы включены в API лесозаготовки, общественное достояние и общие коллекции.

Кажется, не отвечает на вопрос. BeanComparator сравнивает два bean-компонента по одному свойству; вопрос заключается в одновременном сравнении нескольких полей.

Haroldo_OK 07.01.2015 18:34

BeanComparator можно использовать для сортировка коллекции.
Это реализация Comparator, которая сравнивает компоненты на основе значения общего свойства.

BeanComparators are generic comparators that can act upon any Java Bean. With a good underlying bean reflection system, they can handle a bean with bean properties, arrays, collections, and maps.

If we have a java.util.List of Java Beans of type Person —- where Person has an age that's an Integer, a name that's a String, and a country that's a Country bean (which itself has a String name) —- we can sort it anyway we want with a BeanComparator.

Some examples:

List people = ...; // list of Person objects

//sort by age
BeanComparator comp = new BeanComparator("age");
Collections.sort(list, comp);

//sort by name
BeanComparator comp = new BeanComparator("name");
Collections.sort(list, comp);

//sort by country name
BeanComparator comp = new BeanComparator("country.name");
Collections.sort(list, comp);

Нет необходимости писать PersonComparator с множеством опций свойств для сортировки. Вместо этого обо всем позаботится один класс BeanComparator.


Вы найдете полный пример здесь со следующим сценарием:

If you were implementing a comparator to compare properties dynamically (e.g., think of sorting rows in a table on a Web page based on which column the customer selects), then you could put off building your comparator until you knew which property had been selected for sorting.

This is where BeanComparator really shines. The massive amounts of code you'd normally write to implement this behavior are reduced to a few lines when you use BeanComparator.

Кажется, не отвечает на вопрос. BeanComparator сравнивает два bean-компонента по одному свойству; вопрос заключается в одновременном сравнении нескольких полей.

Haroldo_OK 07.01.2015 18:34

что, если у меня есть более двух beans, содержащих имя, возраст, название страны, как мне сравнить его с BeanComparater? Bcoz, BeanComparater в основном используется для сравнения двух java beans ... Можно ли сравнить свойства более двух java beans ...

samkit shah 12.01.2015 14:10

@samkitshah не уверен: я не работал с ним последние 5 лет (поскольку эти ответы были написаны в 2009 году)

VonC 12.01.2015 14:31

Другие вопросы по теме