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




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-компонента по одному свойству; вопрос заключается в одновременном сравнении нескольких полей.
BeanComparator можно использовать для сортировка коллекции.
Это реализация Comparator, которая сравнивает компоненты на основе значения общего свойства.
BeanComparatorsare 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.Listof Java Beans of typePerson—- wherePersonhas an age that's anInteger, 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 aBeanComparator.
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
BeanComparatorreally shines. The massive amounts of code you'd normally write to implement this behavior are reduced to a few lines when you useBeanComparator.
Кажется, не отвечает на вопрос. BeanComparator сравнивает два bean-компонента по одному свойству; вопрос заключается в одновременном сравнении нескольких полей.
что, если у меня есть более двух beans, содержащих имя, возраст, название страны, как мне сравнить его с BeanComparater? Bcoz, BeanComparater в основном используется для сравнения двух java beans ... Можно ли сравнить свойства более двух java beans ...
@samkitshah не уверен: я не работал с ним последние 5 лет (поскольку эти ответы были написаны в 2009 году)
Здесь есть несколько хороших ответов: stackoverflow.com/questions/472626/…