获取列表中新添加项目的索引?

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 是为了快速检索值。我不知道它需要多大才能让它变慢...... @Lucas indexOf 的实现必须遍历整个列表,寻找匹配项。与其他查找索引的方法相比,这会很慢。【参考方案7】:

索引将是size(),只需获取它之前添加:

List listA = new ArrayList();
...
int index = listA.size();

listA.add("element 0"); // "element 0" will be at the "index" item

【讨论】:

以上是关于获取列表中新添加项目的索引?的主要内容,如果未能解决你的问题,请参考以下文章

在Maven中新增自定的jar包

了解 Hbase 中新添加/更新行的最佳策略

elasticsearch使用es-head在已有索引中新增字段以及更新记录

jquery获取HTML select下拉列表中新选中option的value值,必须要重新刷新一下页面么?

Qt项目ui文件中新添加的控件在代码中不识别的问题解决

MySQL 8中新增的这三大索引,直接让MySQL起飞了,你竟然还不知道!!(建议收藏)