当前位置: 代码迷 >> java >> 如何比较java中的两个Arraylist值?
  详细解决方案

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

热度:25   发布时间:2023-07-17 20:16:09.0

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

 RunningProcessList:
    Receiver.jar



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

AllProcessList arraylist 包含所有 java 进程, RunningProcessList 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 result = new ArrayList(AllProcessList);
result.removeAll(RunningProcessList);

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

假设您的列表不太长,您可以收集所有不在 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);
        }
    }

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

嗨拉克希米,

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

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

你好

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

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

你应该用

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

!= 比较物理相等,这两个东西是完全相同的“新”对象吗? .equals(Object) 比较了localequality,吃的两个东西“一样”?

为此,您需要覆盖 equals 和 hashCode 方法。 这是 关于此的 。

如果该类是一个内置的 Java 库,那么几率是相等的并且 hashCode 已经完成。

对于排序列表,以下是 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());
    }
}
  相关解决方案