当我尝试过滤包含重复项的数组列表时,会发生以下情况:
ArrayList的内容:
- 奶牛
- 绵羊
- 兰姆
- 鸡肉
- 奶牛
- 绵羊
当我尝试过滤";牛;例如,我得到的是:
1. Cow
1. Cow
我的代码:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setLongClickable(true);
row = mData.get(position);
index = list.indexOf(row);
holder.myTextView.setText(index + 1 + ". " + row);
}
我想要的输出是:
1. Cow
5. Cow
谢谢你的帮助!
编辑:在您进行编辑并意识到您的需求后,我提出了这个想法。检查此代码,此代码适用于API >= 24
:
注意:如果希望值与插入的值保持相同的顺序,请使用LinkedHashMap
,否则可以使用HashMap
。
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
public class Main
{
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Cow");
list.add("Sheep");
list.add("Lamb");
list.add("Cow");
list.add("Chicken");
list.add("Sheep");
Map<String, List<Integer>> indexes = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
indexes.computeIfAbsent(list.get(i), c -> new ArrayList<>()).add(i);
}
System.out.println(indexes);
}
}
输出为:
{Sheep=[1, 5], Chicken=[4], Cow=[0, 3], Lamb=[2]}
使用LinkedHashMap
:对此进行输出
{Cow=[0, 3], Sheep=[1, 5], Lamb=[2], Chicken=[4]}
这将返回列表中位置的索引。
第二版:此为API < 24
Map<String, List<Integer>> indexes2 = new HashMap<>();
for (int i = 0; i < list.size(); ++i) {
String key = list.get(i);
if (indexes2.get(key) == null) {
List<Integer> list1 = new ArrayList<Integer>();
list1.add(i);
indexes2.put(key, list1);
} else {
List<Integer> list2 = indexes2.get(key);
list2.add(i);
indexes2.put(key, list2);
}
}
System.out.println(indexes2);
该输出:
{Sheep=[1, 5], Cow=[0, 3], Chicken=[4], Lamb=[2]}
第一个答案:用于筛选值,以便删除重复项。
要做到这一点,你可以像这样使用HashSet
或LinkedHashSet
:
ArrayList<String> list_with_duplicate_items = new ArrayList<String>();
list_with_duplicate_items.add("Cow");
list_with_duplicate_items.add("Sheep");
list_with_duplicate_items.add("Lamb");
list_with_duplicate_items.add("Chicken");
list_with_duplicate_items.add("Cow");
list_with_duplicate_items.add("Sheep");
HashSet<String> filter = new HashSet(list_with_duplicate_items);
ArrayList<String> new_list = new ArrayList<String>(filter); //or just add to your first ArrayList like list_with_duplicate_items = new ArrayList<String>(filter);