#android #arraylist #filter
#Android #Список массивов #Фильтр
Вопрос:
Когда я пытаюсь отфильтровать список массивов, содержащий дубликаты, происходит следующее:
Содержимое 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
Спасибо за помощь!
Комментарии:
1.
list.filter()
функции возвращают вам все элементы, соответствующие вашему предикату. Поэтому вам нужно его инвертировать. Сделайтеlist.filter{ it != "Cow" }
, чтобы получить все элементы, которые не являются «коровьими»2. Я отредактировал вопрос, результат 1. Cow; 1. Cow
Ответ №1:
РЕДАКТИРОВАТЬ: после вашего редактирования и понимания того, что вам нужно, мне пришла в голову эта идея. Проверьте этот код, это для 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]}
Это возвращает индексы позиции внутри списка.
2-е РЕДАКТИРОВАНИЕ: это для 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);
Комментарии:
1. Спасибо за помощь, но это удаляет дубликаты, я хочу сохранить их (по какой-то причине) и получить «реальные» позиции. Поэтому я хочу, чтобы результат был «1. Cow; 5.Cow»
2. О, извините, я сначала не понял вопроса.
3. @Creesch2.0 Я отредактировал свой комментарий, проверьте это. Возможно, это может вам помочь.
4. Именно тот результат, который я хотел, но .computeIfAbsent взят из API 24, и мой min. API равен 21. Но я действительно ценю вашу помощь и время
5. @Creesch2.0 там еще одно редактирование. Я написал это для вас. Таким образом, он будет выполнять ту же работу, если он ниже API 24. Но если это указано выше, просто используйте первый метод, поскольку он, вероятно, быстрее, чем мой код.