gpt4 book ai didi

java - 从运行时列表中删除重复的字符串

转载 作者:行者123 更新时间:2023-12-01 09:36:28 24 4
gpt4 key购买 nike

我不明白为什么这个函数没有从列表中删除重复的字符串。

private void detectApps() {
//TODO: here set the running apps list to the Adapter
m_processesList =AndroidProcesses.getRunningAppProcesses();
Set<AndroidAppProcess> set= new HashSet<>();
set.addAll(m_processesList);
m_processesList.clear();
m_processesList.addAll(set);
runningAppsAdapter=new AppsAdapter(RunningAppsActivity.this,R.layout.list_item,m_processesList);
m_listView.setAdapter(runningAppsAdapter);
runningAppsAdapter.notifyDataSetChanged();
}

最佳答案

why this function is not removing the duplicate strings from the list?

因为您处理的不是 String,而是处理 AndroidAppProcess,如果您看到 structure of this class :

public class AndroidAppProcess extends AndroidProcess {

private static final boolean SYS_SUPPORTS_SCHEDGROUPS = new File("/dev/cpuctl/tasks").exists();

/** {@code true} if the process is in the foreground */
public final boolean foreground;

/** The user id of this process. */
public final int uid;
...

你可以看到每个android进程都被分配了一个唯一的id。现在有可能您列表中的所有进程都是唯一的。因此,当您将它们转换为 Set 时,不会出现重复项,因此不会删除任何内容。

但是,如果您要处理纯String,那么肯定会删除重复项,如 this 中所述。回答。

<小时/>

方法一

this 中所述答案是,HashSet 使用 Map 实现,后者又使用 hashCode()equals() 来避免重复元素。

解决该问题的一种方法是重写 AndroidAppProcess 类中的 hashCode()equals(),以便它代表您的equals() 标准

例如:

public class AndroidAppProcess extends AndroidProcess {
...
...

@Override
public boolean equals(Object o) {
//return <write a logic that compare this AndroidAppProcess with another AndroidAppProcess.
}


@Override
public int hashCode() {
//return <this androidProcess name>.hashCode();
}

}
<小时/>

方法2

您可以使用 TreeSet 而不是 HashSet 以及自定义比较器来比较字符串数组是否相等。

private void detectApps() {
//TODO: here set the running apps list to the Adapter
m_processesList =AndroidProcesses.getRunningAppProcesses();

//use TreeSet instead of HashSet
Set<AndroidAppProcess> set= new TreeSet<>(new Comparator<AndroidAppProcess>() {
@Override
public int compare(AndroidAppProcess o1, AndroidAppProcess o2) {
return /* Write a code that compares two AndroidAppProcess
For example you can write:

return o1.getPackageName() == o2.getPackageName();

P.S.: I'm not sure as what's the method to get the correct name,
but you get the idea so you can search the library to get the correct name.
*/
}
});

set.addAll(m_processesList);
m_processesList.clear();
m_processesList.addAll(set);
runningAppsAdapter=new AppsAdapter(RunningAppsActivity.this,R.layout.list_item,m_processesList);
m_listView.setAdapter(runningAppsAdapter);
runningAppsAdapter.notifyDataSetChanged();
}

关于java - 从运行时列表中删除重复的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com