【问题标题】:Get last index of duplicate element from arraylist从arraylist获取重复元素的最后一个索引
【发布时间】:2013-01-09 06:37:59
【问题描述】:

我有字符串数组列表

[rose,flower,banana,parrot,rose,bird,flower,rose,banana,bird]

从这个数组中我想要每个重复元素的最后一个索引意味着它应该给我索引

玫瑰=6 花=5 香蕉=7 鸟=8 鹦鹉=4

这样我就可以从重复项中获取最后一个元素。 我不想使用哈希方法删除重复项,因为我想保留元素的索引。 我试图循环遍历这个数组,但它对我不起作用。 我的代码如下。

for(int i=0;i<ProductName.size();i++){
                String uniquename = null;

                for(int j=0;j<ProductName.size();j++){
                    if(ProductName.get(i).equals(ProductName.get(j))){
                        uniquename=ProductName.get(i);

                    }                                       
                }
                if(uniquename != null){
                    UniqueproductName.add(i,uniquename);

                }
            }

我也想要结果数组作为数组列表

夏天:

我想要数组中的所有元素,但有重复的,那么我应该得到那个重复元素的最后一个索引。但我不想使用哈希方法,我希望结果为Arraylist&lt;String&gt;

【问题讨论】:

  • 您的示例包含所有条目的重复项:总是会这样吗?
  • 如果一个字符串只出现一次怎么办?
  • @fge :情况并非如此。请检查我编辑的问题。
  • @Hemantxp 然后看看我的回答
  • 您的示例与您所说的相矛盾:您说您想要 duplicated 元素的最后一个索引,并且您想要的输出包含 parrot 这是 not 重复,那是什么?

标签: java android arraylist


【解决方案1】:

你没有提到String 只出现一次的情况。但一般情况下,你可以使用ArrayListlastIndexOf方法。

【讨论】:

  • 感谢您的回答 Swapnil。但是在这个数组中字符串只能出现一次
  • 你能用代码解释一下吗?如果我有只能出现一次的字符串
  • lastIndexOf 将找出字符串的最后一次出现。如果它只出现一次,那就这样吧。
  • 请注意,如果性能是一个问题,则此解决方案相对于某些替代方案效率非常低。如果不是 - 它是最简单的,可能也是最容易理解的一种,没有理由不使用它。
  • 是的。当我回答时,它看起来像是一个不同的问题,后来被编辑了。
【解决方案2】:

使用Map&lt;String, Integer&gt; 收集索引,然后从此地图构建您的结果:

public final class Foo
{
    private static final List<String> productList = Arrays.asList(
        "rose", "flower", "banana", "parrot", "rose", "bird", "flower", "rose",
        "banana", "bird"
    );

    private static List<String> indicesFor(final List<String> list)
    {
        final Map<String, Integer> indices = new HashMap<String, Integer>();

        final int size = list.size();

        for (int i = 0; i < size; i++)
            indices.put(list.get(i), i);

        final List<String> ret = new ArrayList<String>(indices.size());
        for (final Map.Entry<String, Integer> entry: indices.entrySet())
            ret.add(entry.toString());
        return ret;
    }

    public static void main(final String... args)
    {
        System.out.println(indicesFor(productList));
        System.exit(0);
    }
}

以上代码的输出:

[bird=9, banana=8, rose=7, parrot=3, flower=6]

【讨论】:

  • 但我希望我的输出数组为 arraylist
  • 完成,请参阅编辑后的答案。奇怪的是,您希望将结果作为数组:地图的 .toString() 将返回几乎相同的...
  • 请帮助我理解,因为我在上面的代码中没有看到任何 .toString 。我也可以使用List&lt;string&gt; 作为ArrayList&lt;String&gt;
  • 好吧,只需尝试代码和System.out.println() 生成的地图,您会发现结果与您已经询问的非常接近,无需使用ArrayList
  • 查看编辑后的代码,有示例演示代码。如您所见,这几乎就是您想要的。
【解决方案3】:

-使用ArrayList方法lastIndexOf()

例如:

public class T4 {

    public static void main(String[] args){

        ArrayList<String> ar = new ArrayList<String>();
        HashMap<String,Integer> ax = new HashMap<String,Integer>();
        int count = 0;

        ar.add("rose");
        ar.add("flower");
        ar.add("flower");
        ar.add("Parrot");
        ar.add("rose");
        ar.add("bird");
        ar.add("flower");
        ar.add("rose");
        ar.add("banana");
        ar.add("bird");

        for(String x : ar){


            ax.put(x,ar.lastIndexOf(x));
        }

        for(Map.Entry<String, Integer> map : ax.entrySet()){

            System.out.println(map.getKey()+"- "+map.getValue());
        }

    }

}

【讨论】:

    【解决方案4】:

    您可以从最后一个到第一个,同时保持迄今为止在一组中看到的数据:

    Set<String> set = new HashSet<String>();
    for (int i = list.size()-1; i >=0; i--) { 
      if (!set.contains(list.get(i))) {
            System.out.println(list.get(i) + " " + i);
            set.add(list.get(i));
      }
    }
    

    请注意,此解决方案的 tiem 复杂度平均为 O(n),而迭代使用 lastIndexOf()O(n^2)

    【讨论】:

    • 当你必须遍历整个数组时,从最后一个到第一个有什么意义?
    • @Vic:重点是indexOf() 本身就是O(n),所以迭代使用它是O(n^2),同时从最后一个到第一个,同时保持一组“看到的数据”可以减少时间复杂性到O(n)
    • 不,我是说您可以在从头到尾维护一组“已见数据”。即使复杂性相同,也不需要其他方式。
    • @Vic:您可以在Map&lt;String,Integer&gt; 中维护它 - 是的,如果这样做,从头到尾将非常相似,但是 - 如果您将数据生成到其他一些组件(例如流式传输)- 从最后一个到第一个可能有更好的 延迟 - 因为您从一开始就开始产生答案,而从第一个到最后一个 - 您一次产生所有数据 - 当你完成了。
    【解决方案5】:

    你可以使用这个类:

    http://code.google.com/p/synthfuljava/source/browse/trunk/common/org/synthful/util/HashVector.java.

    这里是描述:

    http://code.google.com/p/synthfuljava/wiki/HashVector.

    它是一个允许通过键或位置访问元素的类。

    如果你不关心线程安全,你应该重写类,用 HashMap 替换 HashTable,用 ArrayList 替换 Vector。

    正如我在下面所做的那样允许 GWT 编译它:

    http://code.google.com/p/synthfuljava/source/browse/trunk/gwt/util/org/synthful/gwt/util/HashList.java


    事实上,这个类的能力扩展是一个框架来构建一个哈希树,它允许 key 是一个 xpath:

    http://code.google.com/p/synthfuljava/wiki/HashTree

    这导致了哈希向量树:

    http://code.google.com/p/synthfuljava/source/browse/trunk/common/org/synthful/util/HashVectorTreeNode.java

    允许通过 xpath 键或分层 xpath 类索引序列进行访问。

    我没有看到我编写的这些类有太多实际用途,但我认为编写一些具有这些功能的类是一个很好的学术练习。但是,HashVector 和 HashList 是我经常使用的经过良好锻炼/驱除的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2016-10-20
      • 2020-05-09
      相关资源
      最近更新 更多