Find all the indexes of an item within a list using stream API
28,223
Solution 1
For a start, using Lambdas is not the solution to all problems... but, even then, as a for loop, you would write it:
List<Integer> results = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (search == list.get(i).intValue()) {
// found value at index i
results.add(i);
}
}
Now, there's nothing particularly wrong with that, but note that the critical aspect here is the index, not the value. The index is the input, and the output of the 'loop'.
As a stream::
List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7);
int search = 16;
int[] indices = IntStream.range(0, list.size())
.filter(i -> list.get(i) == search)
.toArray();
System.out.printf("Found %d at indices %s%n", search, Arrays.toString(indices));
Produces output:
Found 16 at indices [2, 5]
Solution 2
To find the indexes of every value in a List
as a Map
, we can use an IntStream
of indexes with Collectors.groupingBy
.
import java.util.stream.Collectors;
import java.util.stream.IntStream;
//...
final Map<Integer, List<Integer>> indexMap = IntStream.range(0, list.size()).boxed()
.collect(Collectors.groupingBy(list::get));
//{16=[2, 5], 5=[4], 6=[1], 7=[6], 10=[0], 46=[3]}
//Map of item value to List of indices at which it occurs in the original List
Now, if you want to get the list of indices for search
, you can do so as follows:
System.out.println(indexMap.get(search));
Author by
mallikarjun
Updated on July 09, 2022Comments
-
mallikarjun almost 2 years
I am trying sequential search using Java 8 streams and lambda expressions. Here is my code
List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7); int search = 16; list.stream().filter(p -> p == search).forEachOrdered(e -> System.out.println(list.indexOf(e)));
Output: 2 2
I know
list.indexOf(e)
always prints the index of the first occurrence. How do I print all the indexes? -
Whome over 9 yearsIs there exra %n at the end of printf function, three subsitutes but two params was provided?
-
rolfl over 9 years@Whome - the
%n
adds an OS specific line-terminator (a well-behaved\n
). It does not need a matching substitution value. (See "Line Separator in the documentation )