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

时间:2013-01-09 06:38:00

标签: java android arraylist

我有字符串arraylist

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

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

的索引
  

rose = 6 flower = 5 banana = 7 bird = 8 parrot = 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

总结:

我想要数组中的所有元素但是有重复然后我应该得到该重复元素的最后一个索引。但我不想使用Hash方法以及我想要结果作为Arraylist<String>

5 个答案:

答案 0 :(得分:2)

String仅出现一次时,您没有提到过这种情况。但一般来说,您可以使用ArrayList的{​​{3}}方法。

答案 1 :(得分:0)

使用Map<String, Integer>收集索引,然后从此地图构建结果:

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]

答案 2 :(得分: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));
  }
}

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

答案 3 :(得分:0)

- 使用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 :(得分:0)

您可以使用此课程:

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

以下是描述:

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

这是一个允许按键或按位访问元素的类。

如果您不关心线程安全性,则应该通过将HashTable替换为HashMap和Vector with ArrayList来重写该类。

就像我在下面做的那样,允许它由GWT编译:

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

<小时/> 事实上,这个类的功能扩展是一个构建哈希树的框架,允许键成为一个xpath:

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

因此导致了hashvector树:

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

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

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