Javaでオブジェクトのプリミティブ型とコレクションを含む二つのオブジェクトそれぞれを比較する方法?

praxnet:

私は2つのDTO私は定型的なコードを避けるために、ロンボクを使用していますことを、してください、注意事項を次のようにオブジェクトを持っています。

DTOA

import lombok.Data;
import java.util.List;

@Data
public class DtoA {

    private String name;
    private String number;
    private List<String> aList;
}

DtoB

import lombok.Data;
import java.util.List;

@Data
public class DtoB {
    private String name;
    private String phone;
    private List<String> bList;
}

私は、私は次のようなオブジェクトのアダプタの種類を作成しているので、両方のオブジェクトの特定のフィールドを比較したいです

DtoAdapter

import lombok.Data;
import java.util.List;

@Data
public class DtoAdapter {
    private String nameText;
    private List<String> xList;
}

以下の異なる順序で文字列が含まれているため、aListのとbListの私は、この比較は失敗しているの比較を行うにしようとしています主な方法で自分のテストクラスです。私はその順序を気にせずに、リストの内容を比較したいです。

テスト

import junit.framework.Assert;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        DtoA a = new DtoA();
        List<String> aList = new ArrayList<>();
        aList.add("x"); aList.add("y"); aList.add("z");
        a.setName("abc"); a.setNumber("123"); a.setAList(aList);

        DtoB b = new DtoB();
        List<String> bList = new ArrayList<>();
        bList.add("z"); bList.add("x"); bList.add("y");
        b.setName("abc"); b.setPhone("123"); b.setBList(bList);

        DtoAdapter a1 = new DtoAdapter();
        a1.setNameText(a.getName()); a1.setXList(a.getAList());

        DtoAdapter b1 = new DtoAdapter();
        b1.setNameText(b.getName()); b1.setXList(b.getBList());

        // comparision failing because of lists contains string in different orders
        Assert.assertEquals(a1, b1);
    }
}

注:私は(DtoAdapterクラスに匹敵するインタフェースを実装することにより)のcompareToを書いて試してみました。しかし、私は次のようなcompareToメソッドを持つ2つのリストの比較を書くことができませんでした

同等のインターフェースを持つDtoAdapter

import lombok.Data;
import java.util.List;

@Data
public class DtoAdapter implements Comparable<DtoAdapter>{
    private String nameText;
    private List<String> xList;

    @Override
    public int compareTo(DtoAdapter o) {
        return this.getNameText().compareTo(o.getNameText());
        // how to compare this.getXList() and o.getXList() with compareTo?
    }
}
また:

あなたが拡張されていないことを楽しみにしていますComparableが、オーバーライドされたequals(と一緒にクラスの実装をhashcodeもちろん)。

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    DtoAdapter that = (DtoAdapter) o;
    // following line of code specifically
    return Objects.equals(nameText, that.nameText) &&
            that.getXList().containsAll(xList) && xList.containsAll(that.getXList());
}

文書からさらにComparable、インタフェースは、主に発注要素のために使用されていない等価比較のために:

このインタフェースは、オブジェクトに全体順序付け課し実装する各クラスのそれを。この順序は、クラスの自然順序付けと呼ばれ、クラスのcompareToメソッドは、そのように呼ばれている自然の比較方法

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312166&siteId=1