问题描述
我有两个 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);
}
}
}
1楼
查看的文档,尤其是方法。
List result = new ArrayList(AllProcessList);
result.removeAll(RunningProcessList);
然后,您可以遍历该列表并根据需要调用System.out.println
,就像您在上面所做的那样……但这就是您想要做的吗?
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楼
嗨拉克希米,
我赞成因为我认为它是最好的代码,适合您的需求。 所以我不打算在这个已经很长的列表中添加另一个代码片段,我只是想向您指出两件事:
- 如果您的进程是唯一的(无论它们的名称/id 是什么),您可能会考虑使用 (Hash)Sets 来存储它们,以便更好地执行所需的操作。 只有当您的列表很大时,这才应该是一个问题。
-
使用
ActiveProcesses
和InactiveProccesses
而不是您当前的两个列表怎么样? 如果进程更改其状态,您只需将其从一个列表中删除并将其插入另一个列表中。 这将导致整体设计更简洁,您可以立即访问未运行的进程。
你好
4楼
根据 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 已经完成。
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());
}
}