0

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

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();
}
4

2 回答 2

1

为什么这个函数没有从列表中删除重复的字符串?

因为您不是在处理Strings,所以您正在处理AndroidAppProcess并且如果您看到此类的结构

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为没有重复项时,不会删除任何内容。

但是,如果您一直在处理 pure String,那么肯定会删除重复项,如答案中所述。


方法一

正如这个答案中提到的,AHashSet使用了一个Map实现,而后者又使用hashCode()equals()避免了重复的元素。

解决问题的一种方法是在类中覆盖hashCode()和,以便它代表您的标准equals()AndroidAppProcessequals()

例如:

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();
  }

}

方法二

您可以使用 aTreeSet而不是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();
}
于 2016-08-10T04:33:54.997 回答
0

在这里,您的哈希集是 AndroidAppProcess 的列表,尽管其中许多对象的实例变量的值相同,但对象是不同的。因此,不会删除重复项。相反,您应该尝试使用一组字符串,然后删除重复项

于 2016-08-10T04:36:57.137 回答