我在Java中有一个ArrayList,我需要在其中找到所有特定对象。 方法ArrayList.indexOf(Object)只找到一个匹配项,所以我似乎需要别的东西。
答案 0 :(得分:17)
我认为你不需要过于花哨。以下应该可以正常工作:
static <T> List<Integer> indexOfAll(T obj, List<T> list) {
final List<Integer> indexList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (obj.equals(list.get(i))) {
indexList.add(i);
}
}
return indexList;
}
答案 1 :(得分:4)
我想你需要得到ArrayList的所有索引,其中该槽上的对象与给定对象相同。
以下方法可能会执行您希望它执行的操作:
public static <T> int[] indexOfMultiple(ArrayList<T> list, T object) {
ArrayList<Integer> indices = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(object)) {
indices.add(i);
}
}
// ArrayList<Integer> to int[] conversion
int[] result = new int[indices.size()];
for (int i = 0; i < indices.size(); i++) {
result[i] = indices.get(i);
}
return result;
}
使用equals
方法搜索对象,并使用索引将当前数组索引保存到列表中。您在问题中指的是indexOf
,它使用equals
方法来测试相等性,如Java文档中所述:
搜索给定参数的第一次出现,使用
equals
方法测试相等性。
答案 2 :(得分:2)
迭代所有元素,不要破坏循环
ArrayList
的每个元素与您的object
(arrayList.get(i).equals(yourObject)
)进行比较
如果匹配,则索引(i)应存储到单独的ArrayList(arraListMatchingIndexes)中。
当我需要这些职位的时候,有时这样我会“全部删除”。
我希望它有所帮助!
答案 3 :(得分:2)
待办事项
for (int i=0; i<arrList.size(); i++){
if (arrList.get(i).equals(obj)){
// It's an occurance, add to another list
}
}
希望这有帮助。
答案 4 :(得分:2)
这与此answer类似,只是使用stream
API。
List<String> words = Arrays.asList("lorem","ipsum","lorem","amet","lorem");
String str = "lorem";
List<Integer> allIndexes =
IntStream.range(0, words.size()).boxed()
.filter(i -> words.get(i).equals(str))
.collect(Collectors.toList());
System.out.println(allIndexes); // [0,2,4]
答案 5 :(得分:0)
如果要预先计算 List
中每个值的索引,可以对 Collectors.groupingBy
的索引使用 IntStream
。
import java.util.stream.Collectors;
import java.util.stream.IntStream;
//...
List<Integer> list = Arrays.asList(1, 2, 2, 1, 4, 5, 4, 3, 4, 5, 0);
final Map<Integer, List<Integer>> indexMap = IntStream.range(0, list.size()).boxed()
.collect(Collectors.groupingBy(list::get));
//Map of item value to List of indexes at which it occurs in the original List
然后,要查找特定值的所有索引,请在恒定时间内对 get
使用 Map
。
List<Integer> indexes = indexMap.get(value);