2017-12-12 11 views
0
ArrayList<ParkingList> Parkings = new ArrayList<ParkingList>(); 
ArrayList<ParkingList> ParkingsDB = new ArrayList<ParkingList>(); 

存在しない私のカスタムの配列リストの要素を検索する方法、Parkingsは(A、B、C、D)のオブジェクトとParkingsDBを含むことができる含んでもよい(B)例えば、別の配列リストに

私はCを見つけることができますどのように

、D

私はこの方法を使用してみましたが、それは仕事をdidint

ArrayList<ParkingList> temp = new ArrayList<ParkingList>(Parkings); 
temp.removeAll(ParkingsDB); 

私のクラス定義:

public class ParkingList { 
    Rectangle R; 
    String Name; 
    int level; 
    String BuildingName; 

    public ParkingList(String BuildingName,String Name, Rectangle R, int level) { 
     this.R=R; 
     this.Name=Name; 
     this.level=level; 
     this.BuildingName=BuildingName; 
    } 
} 

ちょうど私が知りたいのは、私が正しい方法の上で使った方法でしたか?多分私は修正する必要がある別の問題があります。

私の基準は、あるオブジェクトのすべての属性が別のオブジェクトで同じである場合にのみ、2つのオブジェクトが等しいことです。

+1

を定義する "動作しませんでした"。 'ParkingList'はどのように定義されていますか? –

+0

どの基準で2つのオブジェクトが等しいか? –

+0

は、例えば、车场は、これら2つのオブジェクトを含む 対象物1:(モール、C1、rectangle1,1) オブジェクト2: オブジェクト1:ParkingsDBはこれだけオブジェクトを含む (学校、B1、rectangle2,2)(モール、c1、rectangle1,1) 私はParkingsにあるがParkingsDBにないオブジェクトを見つけたいと思っています。異なる値を持つ偶数の要素が1つのオブジェクトは等しくありません。 –

答えて

1

カスタムタイプのコレクションにremoveAllを使用するには、equalsメソッドの実装を提供する必要があり、可能であればコレクションAPIの特定のコレクションで使用されるhashCodeメソッドを使用する必要があります。

もう1つの解決策は、removeIfを利用し、2つ以上のオブジェクトが等しい場合に定義する基準を指定することです。

この場合

ArrayList<ParkingList> temp = new ArrayList(Parkings); 
temp.removeIf(x -> ParkingsDB.stream() 
           .anyMatch(e -> e.getName().equals(x.getName()))); 

temp内の任意のオブジェクトは、ParkingsDBにおける任意のオブジェクトと同じ名前を持っている場合、基準は、それがtempリストから削除されるものとされています。

equalshashCodeの独自の実装を提供するか、上記の例を使用するかどうかを決定するだけで済みます。いずれの場合も、指定された2つのオブジェクトがいつと等しいかを定義する基準をとする必要があります。


これは当面の問題ではありませんが、Java命名規則をまったく尊重していないようです。

変数だけでなく、(メソッドの特別タイプであるコンストラクタを除く)の方法は、それが车场ではなく、あるべき小文字で始まり、キャメルケース命名規則すなわちいうより车场に従ってください名前それは名前でなければなりませんなど

はまた、あなたはParkingListの状態を暴露自由に持っているようです。 施行カプセル化ここではすべての変数をとすると、となり、必要に応じてゲッターとセッターだけが提供されます。

+0

これは、オブジェクト1のすべての属性が他の配列リストのオブジェクト2と等しい場合です。 1つの等しい属性が見つかった場合にのみこれが行われますか? –

+0

@Aominè。 OPは完全に修正されるために、突然変異する「パーキング」が許可されているとは言いませんでした。 – tsolakp

0

すでに述べたように、ParkingList.equals()メソッドを実装するのが最も簡単な方法です。たとえば、IDEで生成することができます。あなたのコードより

temp.removeAll(ParkingsDB); 

は、あなたが期待どおりに動作します。これはリストの実装が要素をチェックするためには基本的にequals()メソッドに依存するために起こります。

また、その後のストリームを使用することができます:

ArrayList<ParkingList> temp = Parkings.stream() 
    .filter(parking -> !ParkingsDB.contains(parking)) 
    .collect(Collectors.toList()); 
関連する問題