java - Java 中查找 2 个集合的差异

标签 java android

我有两个 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 中的元素。有什么建议

最佳答案

编辑:添加马特的评论

RemoveAll 正在比较对象指针而不是内容,这就是它无法找到任何重合的原因。

您可以通过观察

的返回值来检查这一点
difference.removeAll(oldRunningTaskInfos);

(false 表示“并非巧合”)

可能最好的方法是将 RunningTask 封装到一个覆盖 equals() 和 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;
}

关于java - Java 中查找 2 个集合的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9732871/

相关文章:

java - 为什么@Formula返回空值

java - 这个自定义 "path finding"算法有什么问题?

Java GC 日志充满了奇怪的字符

java - Swing- 取消对话框时关闭整个应用程序

java - 处理谷歌日期字符串并递增它们

android - 解锁锁定的java文件Android工作室

android - 单元测试定位服务

android - Gradle Android 插件 - 添加自定义 flavor 属性?

android - 将 Android 位图转换为 OpenCV Mat 并向后转换

java - 如何从主类调用另一个 Activity 的方法