【问题标题】:How to compare two Arraylist values in java?如何比较java中的两个Arraylist值?
【发布时间】:2010-07-02 04:51:24
【问题描述】:

我有两个 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);
       }
    }
}

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

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

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

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

    【讨论】:

    • 确保在从中删除项目之前创建原始列表的副本。
    • 我相信您可能需要编辑您的答案。它必须是 result.removeAll(runningProcessList);
    • 如果您不担心 big-O,这没关系......但对于大型数据集,这个解决方案是不切实际的,因为它是 O(n^2)
    • +1 如果它只是一个正在运行的进程的列表,那么集合的大小不太可能占主导地位。可能的优化是存储排序的列表或使用集合。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你好拉克希米,

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

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

      问候

      【讨论】:

        【解决方案4】:

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

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

        你应该用

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

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

        为此,您需要重写 equals 和 hashCode 方法。这是一个article

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

        【讨论】:

          【解决方案5】:

          对于排序列表,以下是 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());
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-01-15
            • 1970-01-01
            • 2012-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多