2016-06-21 8 views
0

2つのArrayListsから異なる要素をすべて保持し、それらを別々の配列に保存します。私はローカルとリモートのArrayListを持っています(ローカルは私のデバイスにあり、私はローカルデータベースから読み込んで作成しています)。あなたは私のサーバーから取得していると推測できるリモート。 ローカルリストからすべての要素をidで削除するために、ローカルとリモートの違いをすべて知りたい(リモートのlsitに最新のデータが含まれていると仮定して)。他の要素に含まれていない要素のリストを返します[JAVA/ANDROID]

マイリモートリストはこの1つである:

[ 
{ 
"userID": 8, 
"address": "6 Lamond Place, Aberdeen, AB25 3UT", 
"price": 1, 
"lastUpdated": "1466437965391", 
"id": 175 
}, 
{ 
"userID": 8, 
"address": "26 Meadgrey, Edinburgh, EH4", 
"price": 4, 
"lastUpdated": "1466438561094", 
"id": 176 
} 
] 

私のローカルリストがあるが、このデータが含まれています。

[ 
Property{id=174, userID=8, address='4', price='3', lastUpdated='1466437959249'}, 
Property{id=175, userID=8, address='6 Lamond Place, Aberdeen, AB25 3UT', price='1', lastUpdated='1466437965391'}, 
Property{id=176, userID=8, address='26 Meadgrey, Edinburgh, EH4', price='4', lastUpdated='1466438561094'} 
] 

これは私が今やっているものです:

public void retainAllLocalFromRemote(List<Property> remoteProperties) { 
    ArrayList<Property> localProperties = getAllPropertyItems(); 

    Log.d(TAG, "Local db size: " + localProperties.size()); 
    Log.d(TAG, "Remote db size: " + remoteProperties.size()); 

    ArrayList<Property> differences = new ArrayList<>(); 

    for(int i = 0; i < localProperties.size(); i ++){ 

      if(remoteProperties.contains(localProperties.get(i))){ 
       Log.d(TAG, "remote contains local property with id: " + localProperties.get(i).getId()); 
      }else { 
       differences.add(localProperties.get(i)); 
      } 

    } 

    Log.d(TAG, "differences list size: " + differences.size()); 
    Log.d(TAG, "differences list : " + differences.toString()); 
} 

これがされ私の現在のログ出力:

Getting all properties from the database... 
06-21 09:54:50.965 10585-10585/xdesign.georgi.espc_retrofit D/EspcItemDataSource: Local db size: 3 
06-21 09:54:50.965 10585-10585/xdesign.georgi.espc_retrofit D/EspcItemDataSource: Remote db size: 2 
06-21 09:54:50.966 10585-10585/xdesign.georgi.espc_retrofit D/EspcItemDataSource: differences list size: 3 
06-21 10:00:48.192 10585-10585/xdesign.georgi.espc_retrofit D/EspcItemDataSource: differences list :[ 
Property{id=174, userID=8, address='4', price='3', lastUpdated='1466437959249'}, 
Property{id=175, userID=8, address='6 Lamond Place, Aberdeen, AB25 3UT', price='1', lastUpdated='1466437965391'}, 
Property{id=176, userID=8, address='26 Meadgrey, Edinburgh, EH4', price='4', lastUpdated='1466438561094'}] 

明らかに、違いのリストはサイズが大きいため、問題があります。私が間違っていることは何ですか?

+2

Property.equals()はどのように見えますか? –

+0

@TimCastelijnsいいえ私はPropertyクラスで実装していません。それが私が間違った結果になるのはなぜですか? –

答えて

3

私は間違っていますか?

List.contains()Object.equals()を使用してアイテムを比較し、それらがリストにあるかどうかを確認します。あなたがそれを実装していない場合、私はそれがアイテムを比較するためにフォールバックとしてtoString値か何かを使用すると信じています。これはあなたの比較を混乱させるでしょう。

現在のところ、ループのすべての項目がの場合はfalseになり、そのためにすべてがdifferencesに追加されます。 equals()hashCode()のカスタム実装をclass Propertyに指定する必要があります。これにより、オブジェクトがいつ他のオブジェクトと等しいかどうかを判断できます。

idで比較するには

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof Property)) return false; 
    Property prop = (Property) o; 
    return Objects.equals(id, prop.id); 
} 

@Override 
public int hashCode() { 
    return Objects.hash(id); 
} 

を行うためにここに簡単なようです。他の値で比較したい場合は、適切と見なして変更することができます。

+0

Worked!ありがとうございました! equalsメソッドをオーバーライドすることを完全に忘れてしまった!ありがとうございました!私は何が間違っているのか理解しようと多くの時間を費やしました!感謝します! –

+1

@GeorgiKoemdzhiev問題ありません。私がこれを知っている唯一の理由は、一度同じミスをしたからです。 –

+1

'o == null || getClass()!= o.getClass() ''(!(o instanceof Property)) ' – Blackbelt

関連する問題