2012-03-16 29 views
0

我在Java中2個hashsets,其中我想找到的差異發現的2套差在Java中

我嘗試下面的代碼所推薦的Oracle的文檔只有

HashSet<RunningTaskInfo> difference = new HashSet<ActivityManager.RunningTaskInfo>(newRunningTasks); 
    HashSet<RunningTaskInfo> oldRunningTaskInfos = new HashSet<ActivityManager.RunningTaskInfo>(oldRunningTasks); 
    difference.removeAll(oldRunningTaskInfos); 

    for(RunningTaskInfo d : difference){ 
     ComponentName cn = d.baseActivity; 
     Log.d("com.manugupt1.fua","Comparing : " + i + cn.getPackageName() + "****" + cn.getClassName() + "****" + cn.getShortClassName()); 

    } 

這些數據值應該顯示不在oldRunningTasks中,但我只從oldRunningTasks獲取元素。任何建議

+1

我覺得代碼ok:它返回newRunningTasks中的所有RunningTaskInfo-s,它們在oldRunningTaskInfos中沒有_equal_對象。 在newRunningTasks,oldRunningTasks中輸出所有值以進行檢查。 – Oliv 2012-03-16 07:51:29

+0

似乎非常感謝 – manugupt1 2012-03-16 11:26:36

回答

2

編輯:添加馬特的意見

removeall過的比較對象的指針,而不是內容,這就是爲什麼它是無法找到任何巧合。

您可以通過觀看的

difference.removeAll(oldRunningTaskInfos); 

的返回值(假的意思是「無巧合」)

也許最好的辦法是封裝RunningTask成覆蓋平等的對象檢查這個()和hashcode()方法,然後調用removeAll。考慮到做下面的示例代碼相同,但用列表的:

// Getting two snapshots 
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.RunningTaskInfo> oldRunningTasks=am.getRunningTasks (100); 
List<ActivityManager.RunningTaskInfo> newRunningTasks=am.getRunningTasks (100); 

// We add a new fake task to test that removeAll() is working 
ActivityManager.RunningTaskInfo fakeTask=new ActivityManager.RunningTaskInfo(); 
fakeTask.baseActivity=new ComponentName("Fake","Fake"); 
fakeTask.id=1234; 
newRunningTasks.add(fakeTask); 


// Converting to lists of Comparable objects and get the differences. 
List<RunningTaskInfoComparable> list_difference = convertToComparable(newRunningTasks); 
List<RunningTaskInfoComparable> list_oldRunningTaskInfos = convertToComparable(oldRunningTasks); 
boolean res=list_difference.removeAll(list_oldRunningTaskInfos); 


for(RunningTaskInfoComparable d : list_difference){ 
    ComponentName cn = d.getBaseActivity(); 
    Log.d("com.test.tasks","Comparing List: " + cn.getPackageName() + "****" + cn.getClassName() + "****" + cn.getShortClassName()); 
} 

其中RunningTaskInfoComparable是這樣實現的:

public class RunningTaskInfoComparable { 

    android.app.ActivityManager.RunningTaskInfo runningTaskObject; 

    public RunningTaskInfoComparable (android.app.ActivityManager.RunningTaskInfo obj) 
    { 
     runningTaskObject=obj; 
    } 


    // Observer 
    public ComponentName getBaseActivity(){ 
     return runningTaskObject.baseActivity; 
    } 



    @Override 
    public int hashcode() 
    { 

     int result = HashCodeUtil.SEED; 

     // More data could be added to the hash... 
      result = HashCodeUtil.hash(result, runningTaskObject.id); 
     return result; 
    } 


    @Override 
    public boolean equals(Object obj) { 

     if (!(obj instanceof RunningTaskInfoComparable)) { 
      return false; 
      } 

     // Criteria: Same task id means same entity 
     return (runningTaskObject.id==((RunningTaskInfoComparable)obj).runningTaskObject.id); 
    } 


} 

和convertToComparable樣子:

private List<RunningTaskInfoComparable> convertToComparable (List<ActivityManager.RunningTaskInfo> _original) 
{ 
    List<RunningTaskInfoComparable> retList=new ArrayList<RunningTaskInfoComparable>(); 

    for(RunningTaskInfo t : _original){ 
     RunningTaskInfoComparable tc = new RunningTaskInfoComparable(t); 
     retList.add(tc); 
    } 
    return retList; 
} 
+0

實際上,removeAll()在Oracle JDK實現中不使用Comparable接口。它使用.equals(),它的默認實現是比較指針。如果你需要比指針比較更多的東西,覆蓋.equals()(以及哈希碼,因爲兩者應該總是一起被覆蓋) – Matt 2012-03-16 15:35:16

+0

@Matt - 編輯你的評論的答案。謝謝。 – 2012-03-16 18:11:45