iT邦幫忙

0

如何 更快對比2個 object中名字一樣的attributes in java?

  • 分享至 

  • xImage

想問有方法更快對比2個objects中名字一樣attributes? 而2個object也有名字不一樣的attributes 但可以不用compare.
For example,
if (a.element1.equals(b.element1))
if (a.element2.equals(b.element2))

Hankz iT邦新手 2 級 ‧ 2021-08-31 13:19:15 檢舉
所謂的更快對比是指
比對的效率還是寫法上的精簡
如果是比對效率equals原則上不會有什麼問題
至於寫法 比起精簡
可讀性有時候更為重要
想看看有沒有function/mothod or 可以用到datastructure or loop 方法來 compare.
感覺可以 用loop 來compare attribute(i) 再把result 放在 map or list裡.
可讀性來說,因為是大量類似的mapping,所以結構也是例子中的
if (a.element(i).equals(b.element(i))){
c.element(i)="Y" }
然後將c寫入db
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
喵凹咿唉思嗯
iT邦研究生 5 級 ‧ 2021-09-02 12:07:28
最佳解答

簡單以Field做驗證, 看看是不是你要的? 不過是簡單寫的, 要用的話結構可能要改改會比較好 ww

public class CheckTest{

    @Test
    public void checkTest1(){
        A a = new A();
        B b = new B();
        var result = Arrays.stream(a.getClass().getDeclaredFields())
                .filter( field -> !field.getName().contains("this$") )
                .filter( fieldA ->
                        Arrays.stream(b.getClass().getDeclaredFields())
                                .anyMatch( fieldB->
                                        fieldB.getName().equals(fieldA.getName())))
                .peek( fieldA -> {
                    try {
                        System.out.println("Check for: " + fieldA.getName()+":" + fieldA.get(a));
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                })
                .allMatch( fieldA ->
                        Arrays.stream(b.getClass().getDeclaredFields())
                                .anyMatch( fieldB->
                                {
                                    try {
                                        return fieldB.get(b).equals(fieldA.get(a));
                                    } catch (IllegalAccessException e) {
                                        e.printStackTrace();
                                    }
                                    return true;
                                }
                                ));

        System.out.println("final result:" + result);

    }

    class A{
        int a = 10;
        String b = "ABC";
        String c = "CDF";
    }

    class B{
        int a = 10;
        String b = "ABC";
        String d = "CDF";
    }

}

output:

Check for: a:10
Check for: b:ABC
final result:true

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-08-31 15:47:22

我看不懂你想做什麼
參考看看這篇 reflection有沒有幫助

0
japhenchen
iT邦超人 1 級 ‧ 2021-08-31 16:00:29

用JSONUtil把ojbect serialize成json string

String jsonString = JSONUtil.serialize(your_object);

再用正則表達式,把atttribute name全部抓出來放在listMatches陣列裡

List<String> listMatches = new ArrayList<String>();
Pattern pattern = Pattern.compile("\"([^\"]+)\":");
Matcher matcher = pattern.matcher(jsonString); 
while( matcher.find() ) {            
    listMatches.add( matcher.group() );
}

..兩個object都抓
再用for去比對兩個listMatches裡,是否具有相同的attributes,有就println出來

for(String strA : listMachers1){
    for(String strB : listMachers2){
        if(strA==strB){
            System.out.println(strA);
        }
    }
}   

PS...我沒在寫java,只是用其他語言的邏輯來處理相同的事情,高手還請鞭小力一點,我怕痛

我要發表回答

立即登入回答