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