获取列表中新添加项目的索引?
Posted
技术标签:
【中文标题】获取列表中新添加项目的索引?【英文标题】:Get index of newly added item in a list? 【发布时间】:2014-10-19 20:44:50 【问题描述】:我想将新添加的元素的索引放入数组列表中。例如
List listA = new ArrayList();
// Lots of code adding and removing things from `listA`, imagine `listA` now
// contains approx 10,000 records
listA.add("element 0");
如何找到新增项目的索引?
我认为也许,我需要一个不同的数据结构,但想不出要使用什么。
【问题讨论】:
出于兴趣,为什么需要知道这个索引值?它向我暗示你可能做错了事...... 【参考方案1】:添加到列表中的第一个元素的索引为 0。
添加的最后一个元素将具有索引listA.size()-1
。
但是,您应该注意,如果您从列表中删除元素,一些索引(索引高于被删除元素的元素的索引)将会改变。例如,如果您删除第 n 个元素,则之前的第 (n+1) 个元素将成为第 n 个元素。
感谢塔莱克斯的评论。我忘记了indexOf()
,它返回所提供元素的索引(如果在列表中找到该元素)。但是,这需要线性搜索时间。
如果您希望将列表的索引视为键来查找存储在列表中的值,则最好使用HashMap<Integer,String>
。
【讨论】:
你可以使用indexOf
方法。
好的,我将从列表中删除元素,所以这将是一个问题。我只是懒得删除元素,但这似乎是不好的编码......是否有任何其他数据结构可以删除项目,同时保留索引以访问项目?
另外请记住,如果(ab)使用set()
,这将不起作用
Hashmap 似乎是前进的方向。感谢您的帮助。【参考方案2】:
您可以使用indexOf
方法检索列表中任何元素的索引:
List<String> listA = new ArrayList<String>();
//Lots of code adding and removing things from listA, imagine listA now contains approx 10,000 records
String str = "element 0"
listA.add(str);
int index = listA.indexOf(str)
如果你只关心最后一个元素的索引,列表 javadoc 会说:“ add(E e) 将指定元素附加到此列表的末尾(可选操作)。"
所以你可以使用:
List<String> listA = new ArrayList<String>();
//Lots of code adding and removing things from listA, imagine listA now contains approx 10,000 records
listA.add("element 0");
int index = listA.size()-1 //minus 1 because index start at 0
您似乎关心按索引(标识符?)访问元素,您应该看看 Map:
Map<int, String> mymap = new HashMap<int, String>();
mymap.add(1, "element1");
mymap.add(2, "element2");
mymap.add(3, "element3");
mymap.get(3);//return "element3"
【讨论】:
【参考方案3】:与其他建议不同....size()
给出了List
的总大小,并且由于List
索引是从零开始的,因此size() - 1
给出了他列表中最后一个元素的索引。
不要将 ;ast 元素与您刚刚添加的元素混淆。只要我们使用add()
方法,新元素就会在最后附加到列表中,但列表还有另一个将索引作为参数的 add 方法。使用此方法,您可以在列表中的任何位置添加新元素。在这种情况下,size() - 1
不会为您提供最新添加元素的索引。
【讨论】:
【参考方案4】:List
的索引以 0
开头并以 size()-1
结尾。
如果计算元素个数,则与size()-1
相同。
例如,如果您的列表包含 100 条记录,则最后一个元素的索引将为 size()-1
,即 99。
List listA = new ArrayList();
int lastIndex=listA.size()-1;
【讨论】:
【参考方案5】:如果您使用add(element)
,则会保留顺序,因此列表中的最后一个元素将是最近添加的元素。
所以你可以使用listA.get(listA.size-1);
如果您使用的是add(index,element)
,则不会出现这种情况,因为订单不会被保留。
相关问题请参见此处How to get the last value of an ArrayList
【讨论】:
【参考方案6】:List listA = new ArrayList();
String a = "element 0";
listA.add(a);
int index = listA.indexOf(a);
你来了
【讨论】:
如果 listA 包含很多项目,您的解决方案可能是 time cousuming;另一个问题是,如果 ListA 包含相同的项目 好吧,我一直认为 ArrayList 是为了快速检索值。我不知道它需要多大才能让它变慢...... @LucasindexOf
的实现必须遍历整个列表,寻找匹配项。与其他查找索引的方法相比,这会很慢。【参考方案7】:
索引将是size()
,只需获取它之前添加:
List listA = new ArrayList();
...
int index = listA.size();
listA.add("element 0"); // "element 0" will be at the "index" item
【讨论】:
以上是关于获取列表中新添加项目的索引?的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch使用es-head在已有索引中新增字段以及更新记录