Java 从arraylist获取重复元素的最后一个索引

Java 从arraylist获取重复元素的最后一个索引,java,android,arraylist,Java,Android,Arraylist,我有字符串数组列表 [rose,flower,banana,parrot,rose,bird,flower,rose,banana,bird] 从这个数组中,我想要每个重复元素的最后一个索引,这意味着它应该给我每个重复元素的索引 玫瑰=6朵花=5根香蕉=7只鸟=8只鹦鹉=4只 这样我就可以从副本中得到最后一个元素。 我不想使用散列方法删除重复项,因为我想保留元素的索引。 我已经尝试循环通过这个数组,但它对我不起作用。 我的代码如下 for(int i=0;i<ProductName.si

我有字符串数组列表

[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);

                }
            }

for(int i=0;i您没有提到
字符串只出现一次的情况。但一般来说,您可以使用
ArrayList
的方法使用
Map
来收集索引,然后根据该Map构建结果:

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);
    }
}

您可以从最后一个转到第一个,同时维护到目前为止在集合中看到的数据:

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));
  }
}
Set Set=newhashset();
对于(int i=list.size()-1;i>=0;i--){
如果(!set.contains(list.get(i))){
System.out.println(list.get(i)+“”+i);
set.add(list.get(i));
}
}

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

-使用
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());
        }

    }

}
公共类T4{
公共静态void main(字符串[]args){
ArrayList ar=新的ArrayList();
HashMap ax=新的HashMap();
整数计数=0;
ar.add(“玫瑰”);
ar.add(“花”);
ar.add(“花”);
ar.add(“鹦鹉”);
ar.add(“玫瑰”);
ar.add(“bird”);
ar.add(“花”);
ar.add(“玫瑰”);
ar.add(“香蕉”);
ar.add(“bird”);
用于(字符串x:ar){
ax.put(x,ar.lastIndexOf(x));
}
对于(Map.Entry映射:ax.entrySet()){
System.out.println(map.getKey()+“-”+map.getValue());
}
}
}

您可以使用该类:

以下是描述:

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

如果线程安全不是您关心的问题,那么您应该重写该类,用HashMap替换HashTable,用ArrayList替换Vector

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


事实上,该类功能的扩展是一个框架,用于构建允许密钥为xpath的哈希树:

这导致了hashvector树:

它允许通过xpath键或类似xpath的层次索引序列进行访问



我没有看到我编写的这些类有多大的实际用途,但我认为编写一些具有这些特性的类是一个很好的学术练习。然而,HashVector和HashList是我经常使用的经过良好练习/禁用的类。

您的示例包含所有条目的重复项:是否总是这样?如果一个String只发生一次?@fge:情况并非如此。请检查我编辑的问题。@Hemantxp然后查看我的答案您的示例与您所说的相矛盾:您说您想要复制元素的最后一个索引,并且您所需的输出包含
parrot
,它不是重复的,那么是什么呢?谢谢您的回答Swapnil。但是在这个数组中字符串只能出现一次,请使用代码进行解释。如果我有只能出现一次的字符串
lastIndexOf
,则会查找该字符串的最后一次出现。如果它只出现一次,则是它。请注意,如果性能是一个问题,则此解决方案相对于某些备选方案而言效率非常低。如果没有,则是sim是的。当我回答时,它看起来像是一个不同的问题,后来被编辑。当你必须遍历整个数组时,从最后一个到第一个有什么意义?@Vic:点是
indexOf()
本身就是
O(n)
,所以迭代使用它是
O(n^2)
,在维护一组“可见数据”的同时从最后一个到第一个将时间复杂度降低到
O(n)
。不,我是说您可以维护一组“可见数据”从第一个到最后一个。即使复杂程度相同,也不需要另一种方法。@Vic:您可以在
映射中维护它-是的,如果这样做,从开始到结束将非常相似,但是-如果您将数据生成到其他一些组件(例如流式处理)-从最后一个到最后一个可能会有更好的延迟-因为您从一开始就开始生成答案,而从第一个到最后一个-您会在完成后一次生成所有数据。但是我希望我的输出数组作为arraylistDone,请参阅编辑的答案。奇怪的是,您希望结果作为数组:map的.toString()将返回几乎相同的…请帮助我理解,因为我在上面的代码中没有看到任何.to字符串。我也可以使用
List
作为
ArrayList
好的,只需尝试代码和
System.out.println()
生成的地图,您将看到结果与您要求的非常接近,无需使用
ArrayList
查看编辑的代码,这里有一个示例演示代码。正如您所看到的,这正是您想要的。
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());
        }

    }

}