使用列表获取匹配项索引的有效方法
我有两个列表 A 和 B。我想找出 A 中与 listB 元素匹配的元素的索引。像这样的事情:
ArrayList listA = new ArrayList();
listA.add(1);listA.add(2);listA.add(3);listA.add(4);
ArrayList listB = new ArrayList();
listB.add(2);listB.add(4);
ArrayList listC = new ArrayList();
for(int i=0; i<listB.size();i++) {
int element = listB.get(i);
for(int j=0; j<listA.size(); j++) {
if(listA.get(j) == element) listC.add(j);
}
}
我想这是一种丑陋的做法。查找 A 中与 B 中所有元素匹配的所有索引的最佳方法是什么?我相信集合 api 中存在一个名为 containsAll 的方法 - 不认为它返回匹配的索引。
I've two lists A and B. I'd like to find out indexes of elements in A that match elements of listB. Something like this:
ArrayList listA = new ArrayList();
listA.add(1);listA.add(2);listA.add(3);listA.add(4);
ArrayList listB = new ArrayList();
listB.add(2);listB.add(4);
ArrayList listC = new ArrayList();
for(int i=0; i<listB.size();i++) {
int element = listB.get(i);
for(int j=0; j<listA.size(); j++) {
if(listA.get(j) == element) listC.add(j);
}
}
I guess that's one ugly way to doing it. What is the best way to finding all the indexes of A that match all elements in B? I believe there exists a method called containsAll in collections api - don't think it returns matching indexes.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您必须使用
ArrayList
,您可以从ArrayList
创建一个HashSet
。这将使对contains
的调用 O(1)。创建HastSet
需要 O(n) 时间。如果您可以从HashSet
开始,那就最好了。If you had to use an
ArrayList
, you could create aHashSet
from theArrayList
. This would make the call tocontains
O(1). It would take O(n) to create theHastSet
. If you could start with aHashSet
, that would be best.Guava 库提供了一种方法
,可以提供两个集合中包含的元素,但不提供索引。虽然之后应该很容易获得索引。
The Guava libraries come with a method
that will give the elements contained in both sets, but not the indexes. Although it should be easy to get the indexes afterwards.
简单:
但这仅在没有重复的情况下有效,如果有重复的索引,您必须按照您的方式进行操作,导航完整列表。
编辑
我以为你想要元素,而不是索引,集合不会给你索引,只会给你元素。
Simple:
But this only works if there is no repetition, if there are repeated indexes you have to do it the way you did, navigating the full list.
EDIT
I thought you wanted the elements, not indexes, sets are not going to give you indexes, only the elements.
假设没有重复值,为什么不使用 ArrayList.indexOf?
输出
Assuming there's no duplicate values, why not use ArrayList.indexOf?
Output
如果列表 A 和列表 B 按相同的顺序排序(我假设升序,但降序也有效),这个问题有一个 O(n) 解决方案。下面是一些(非正式的、未经测试的)代码。当循环退出时,indexMap 应包含列表 A 中与列表 B 中的元素匹配的每个元素的索引以及列表 B 中匹配元素的索引。
If list A and list B are sorted in the same order (I'll assume ascending, but descending works as well) this problem has an O(n) solution. Below is some (informal, and untested) code. When the loop exits, indexMap should contain the indices of every element in list A that match an element in list B and the index of the matched element in list B.
使用 Apache CollectionUtils,有很多选项
Using Apache CollectionUtils, there are plenty of options