我不明白为什么这个函数没有从列表中删除重复的字符串。
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();
}
答案 0 :(得分:1)
为什么这个函数没有从列表中删除重复的字符串?
因为您没有处理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回答中所述。
方法1
正如this回答中所述,A HashSet
使用Map
实施,后者又使用hashCode()
和equals()
来避免重复元素。< / p>
解决此问题的一种方法是覆盖hashCode()
类中的equals()
和AndroidAppProcess
,以便它代表您的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
与自定义Comparator一起使用,以比较String数组的相等性。
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();
}
答案 1 :(得分:0)
这里你的hashset是AndroidAppProcess的列表,虽然它的许多对象的实例变量的值都是相同的,但是对象是不同的。因此不会删除重复项。您应该尝试使用一组字符串,然后删除重复项