【问题标题】:Filtering a numbered ArrayList<String> that contains Duplicates in android在android中过滤包含重复项的编号ArrayList<String>
【发布时间】:2021-04-15 06:58:11
【问题描述】:

当我尝试过滤包含 Duplicates 的 Arraylist 时,会发生以下情况:

ArrayList 的内容:

  1. 羔羊

例如,当我尝试过滤“奶牛”时,我得到了这个:

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

感谢您的帮助!

【问题讨论】:

  • list.filter() 函数会返回与谓词匹配的所有元素。所以你必须反转它。执行list.filter{ it != "Cow" } 以获取所有不是“牛”的项目
  • 我编辑了问题,结果是 1. Cow; 1. 牛

标签: android arraylist filter


【解决方案1】:

编辑:在您进行编辑并意识到您需要什么之后,我提出了这个想法。检查这段代码,这是给API &gt;= 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 &lt; 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]}  

第一答案:这用于过滤值,以便您可以删除重复项。

为此,您可以像这样使用HashSetLinkedHashSet

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. Cow; 5.Cow”
  • 哦,抱歉我一开始没看懂问题。
  • @Creesch2.0 我编辑了我的评论,检查一下。也许它可以帮助你。
  • 正是我想要的输出,但 .computeIfAbsent 来自 API 24,而我的最小值。 API 是 21。但我非常感谢您的帮助和时间
  • @Creesch2.0 那里,另一个编辑。我为你写的。这样,如果它低于 API 24,它会做同样的工作。但如果它高于,只需使用第一种方法,因为它可能比我的代码更快。
猜你喜欢
  • 1970-01-01
  • 2015-04-18
  • 2020-01-02
  • 2017-03-08
  • 2018-06-18
  • 2011-04-26
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多