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

时间:2010-07-02 04:51:24

标签: 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);
       }
    }
}

5 个答案:

答案 0 :(得分:15)

请查看List的文档,尤其是removeAll()方法。

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

然后,您可以遍历该列表并根据需要调用System.out.println,就像您上面所做的那样......但这是您想要做的吗?

答案 1 :(得分:4)

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

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

重要的是,RunningProcessList包含与AllProcessList相同的实例(或者对象必须实现功能equals方法)。


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

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

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

答案 2 :(得分:1)

嗨lakshmi,

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

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

答案 3 :(得分:0)

根据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方法。这是一个article

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

答案 4 :(得分:0)

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

public void compareLists(final List<T> allProcesses, final List<T> runningProcesses) {
    // Assume lists are sorted, if not call Collection.sort() on each list (making this O(nlogn))
    final Iterator<T> allIter = allProcesses.iterator();
    final Iterator<T> 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());
    }
}