0

我有字符串数组列表

[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

总结:

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

4

5 回答 5

2

您还没有提到 aString只出现一次的情况。但一般来说,你可以使用lastIndexOf方法ArrayList

于 2013-01-09T06:41:48.877 回答
0

使用 aMap<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]
于 2013-01-09T06:44:58.220 回答
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));
  }
}

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

于 2013-01-09T06:45:07.063 回答
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());
        }

    }

}
于 2013-01-09T06:49:50.337 回答
0

你可以使用这个类:

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 是我经常使用的经过良好锻炼/驱除的类。

于 2013-01-09T06:54:41.177 回答