有这样一个场景,我获取所有包名,现在要给它建立一个黑名单,黑名单里面的内容要过滤掉
/**
* 从 mAllList 中去除所有 mSubList 中与之重复的元素
* @param mAllList
* @param mSubList
* @return
*/
public static List<String> getFilterList(List<String> mAllList, List<String> mSubList) {
//第一步:构建mAllList的HashMap
//将mAllList中的元素作为键,如果不是String类,需要实现hashCode和equals方法
//将mAllList中的元素对应的位置作为值
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < mAllList.size(); i++) {
map.put(mAllList.get(i), i);
}
//第二步:利用map遍历mSubList,查找重复元素
//把mAllList中所有查到的重复元素的位置置空
for (int i = 0; i < mSubList.size(); i++) {
Integer pos = map.get(mSubList.get(i));
if (pos == null) {
continue;
}
mAllList.set(pos, null);
}
//第三步:把mAllList中所有的空元素移除
for (int i = mAllList.size() - 1; i >= 0; i--) {
if (mAllList.get(i) == null) {
mAllList.remove(i);
}
}
return mAllList;
}
如何使用上面的函数呢?
packageNames = util.getAllPackageNames();
String[] filterList = getResources().getStringArray(R.array.filter_app);
packageNames = util.getFilterList(packageNames, Arrays.asList(filterList));
中间获取包名的函数请看这:https://blog.csdn.net/cau_eric/article/details/99544115
filter_app 的 array 在array.xml 中定义:
<string-array name="filter_app">
<item>com.android.contacts</item>
<item>com.android.settings</item>
<item>com.android.browser</item>
<item>com.android.calendar</item>
<item>com.android.deskclock</item>
<item>com.android.email</item>
<item>com.android.gallery3d</item>
<item>com.android.music</item>
<item>com.android.soundrecorder</item>
<item>com.fsl.ethernet</item>
<item>com.freescale.bleclient</item>
<item>com.freescale.bleserver</item>
<item>com.freescale.a2dpsinkapp</item>
<item>com.freescale.wfdsink</item>
<item>com.android.calculator2</item>
<item>com.android.quicksearchbox</item>
<item>com.freescale.cactusplayer</item>
</string-array>
参考: