如何比较java中的两个Arraylist值?

我有两个Arraylist RunningProcessList AllProcessList它包含以下值

  RunningProcessList: Receiver.jar AllProcessList: Receiver.jar Sender.jar Timeout.jar TimeourServer.jar 

AllProcessList arraylist包含所有java进程,RunningProcessList arraylist包含当前正在运行的进程。 我想比较这两个arraylist我想显示如果进程没有运行。 例如比较两个列表并希望显示以下进程未运行。

  Result: Sender.jar Timeout.jar TimeourServer.jar 

我使用了以下代码,但它不起作用。

 Object Result = null; for (int i = 0; i <AllProcessList.size(); i++) { for (int j = 0; j < RunningProcessList.size(); j++) { if( AllProcessList.get(i) != ( RunningProcessList.get(j))) { System.out.println( RunningProcessList.get(j))); Result =RunningProcessList.get(j); } if(AllProcessList.get(i) != ( RunningProcessList.get(j))) { list3.add(Result); } } } 

看一下List的文档,特别是removeAll()方法。

 List result = new ArrayList(AllProcessList); result.removeAll(RunningProcessList); 

然后,您可以迭代该列表并调用System.out.println ,如上所述,但是您想要做什么?

假设您的列表不是太长,您可以只收集不在RunningProceesList中的AllProcessList的所有元素

  for (Object process : AllProcessList) { if (!RunningProcessList.contains(process)) { list3.add(process); } } 

RunProcessList包含与AllProcessList相同的实例(或者对象必须实现函数equals方法),这一点很重要。


如果您的列表包含Process (或其他一些专用类)的实例,那会更好。

  List AllProcessList = new ArrayList(); List RunningProcessList = new ArrayList(); List list3 = new ArrayList(); ... for (Process process : AllProcessList) { if (!RunningProcessList.contains(process)) { list3.add(process); } } 

英语不是我的第一语言(也不是第二语言),欢迎任何更正

嗨lakshmi,

我赞成noelmarkham的回答,因为我认为这是最好的代码,并且符合您的需求。 所以我不会在这个已经很长的列表中添加另一个代码片段,我只是想指出两件事:

  1. 如果您的进程是唯一的(他们的名称/ id无论如何),您可以考虑使用(哈希)集来存储它们,以便更好地执行所需的操作。 当您的列表很大时,这应该只是一个问题。
  2. 使用ActiveProcessesInactiveProccesses而不是当前的两个列表怎么样? 如果进程更改其状态您只需将其从一个列表中删除并将其插入另一个列表中。 这将导致整体设计更清晰,您可以立即访问未运行的流程。

问候

根据AllProcessList和RunningProcessList上的类型(whocu应该是allProcessList和runningProcessList来遵循Java命名约定),以下内容将不起作用:

 if ( AllProcessList.get(i) != ( RunningProcessList.get(j))) { 

你应该用它替换它

 if (!(AllProcessList.get(i).equals(RunningProcessList.get(j)))) { 

!=比较物理相等,两个完全相同的“新”ed对象是什么? .equals(Object)比较了当地的平等,吃了两个“相同”的东西?

为此,您需要覆盖equals和hashCode方法。 这是一篇关于它的文章 。

如果该类是内置的Java库,则赔率为equals并且hashCode已完成。

对于排序列表,以下是O(n)。 如果需要排序,则此方法变为O(nlogn)。

 public void compareLists(final List allProcesses, final List runningProcesses) { // Assume lists are sorted, if not call Collection.sort() on each list (making this O(nlogn)) final Iterator allIter = allProcesses.iterator(); final Iterator runningIter = runningProcesses.iterator(); T allEntry; T runningEntry; while (allIter.hasNext() && runningIter.hasNext()) { allEntry = allIter.next(); runningEntry = runningIter.next(); while (!allEntry.equals(runningEntry) && allIter.hasNext()) { System.out.println(allEntry); allEntry = allIter.next(); } // Now we know allEntry == runningEntry, so we can go through to the next iteration } // No more running processes, so just print the remaining entries in the all processes list while (allIter.hasNext()) { System.out.println(allIter.next()); } }