从两个不同的类中获取相同的字段

时间:2016-12-14 06:55:03

标签: java

我有A班和B班

在A班我有一些领域

private String name;
private String address;
private String phoneNo;

B班我也有一些领域

private String name;
private String city;
private String phoneNo;

在我的主课程中,我从两个课程中获取字段

A a = new A();
B b = new B(); 
Field[] fieldsFromA = a.getClass().getDeclaredFields();
Field[] fieldsFromB = b.getClass().getDeclaredFields();

我想要另一个Field [],我可以存储A类和B类存在的字段

在这个例子中它将是name和phoneNo

有一种简单的方法吗?

我在考虑做一个双循环来过滤掉相同的字段然后将它们添加到数组中但是有些情况下A类可能包含比B类更多的字段,反之亦然,这可能会导致我错过一些...

3 个答案:

答案 0 :(得分:1)

我们创建了两个变量:

A a = new A("name", "adress", "phoneNo");
B b = new B("name", "city", "phoneNo");

获得他们的领域:

Field[] aF = a.getClass().getFields();
Field[] bF = b.getClass().getFields();

然后:

Set<String> s1 = new HashSet<String>();
Set<String> s2 = new HashSet<String>();
List<Field> aFL = Arrays.asList(aF);
aFL.forEach(field -> {
    String temp = field.getName();
    s1.add(temp);
});
List<Field> bFL = Arrays.asList(bF);
bFL.forEach(field -> {
    String temp = field.getName();
    s2.add(temp);
});

上面的代码会将字段的名称放入集合中。

s1.retainAll(s2);

这里我们得到了集合的交集。

String[] result = s1.toArray(new String[s1.size()]);
for (String f : result) {
    System.out.println(f);
}

然后我们打印输出。

答案 1 :(得分:1)

您可以将其转换为Set,然后将其添加到第三个Set。

你可以这样做:

Set<Field> mySet1 = new HashSet<Field>(Arrays.asList(fieldsFromA));
Set<Field> mySet2 = new HashSet<Field>(Arrays.asList(fieldsFromB));
mySet2.addAll(mySet1);
// then you can convert it Array

答案 2 :(得分:1)

您可以使用HashSet,并将A类中的所有字段放入set
,然后: 对于B类中的字段,如果它包含在set中,则将其添加到目标数组中。

伪代码

for(File file: A){
    set.add(file);
}
for(File file: B){
    if(set.contains(file)){
        targetRes.add(file);
    }
}