Sesq
Sesq

Reputation: 15

How to return an array with the indexes of a certain int from another array

I'm a beginner Java student and I have been trying to write a method that lists all indexes of a certain int within an array. What I've done so far is store the value of that int at its corresponding index within another array but the best I can do is set the values of all other indexes that are not equal to the original int to -1.

I think I need to store the value i within the array and delete all the -1s but I don't know how to do this. By the way, these values are -1 because all my arrays in this program contain ints that are between 0-100. What would I do if possible ints within this array could be any number?

Also surely there is an easier or more efficient way of doing this.

public static int[] maxValueIndex(int[] arr, int targetValue, int x) {
    
    int[] maxValue = new int[x];
    
    
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == targetValue) {
            maxValue[i] = arr[i];
        } else {
            maxValue[i] = -1;
        }
        
    }       
    return maxValue;
    }

Upvotes: 0

Views: 4464

Answers (2)

Nowhere Man
Nowhere Man

Reputation: 19565

If it is required to use arrays only to resolve this task, it may take two passes to create a compacted array containing only valid indexes:

  1. Find the number of matches, and then create and fill a compact array
public static int[] getTargetIndexes(int targetValue, int ... arr) {
    int n = arr.length;
    int targetCount = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] == targetValue) {
            targetCount++;
        }
    } 
    
    int[] indexes = new int[targetCount];

    for (int i = 0, j = 0; j <targetCount && i < n; i++) {
        if (arr[i] == targetValue) {
            indexes[j++] = i;
        }
    }
    
    return indexes;
}
  1. Create an array of the same length, fill it and then compact by using Arrays.copyOf:
public static int[] getTargetIndexes(int targetValue, int ... arr) {
    int n = arr.length;
    int[] indexes = new int[n];

    int targetCount = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] == targetValue) {
            indexes[i] = i;
            targetCount++;
        } else {
            indexes[i] = -1;
        }
    }
    
    for (int i = 0, j = 0; j < targetCount && i < n; i++) {
        if (indexes[i] > -1) {
            indexes[j++] = i;
        }
    }
    
    return Arrays.copyOf(indexes, targetCount); // truncate bad indexes
}

Also, the signature of the method uses vararg to pass the input array as a sequence of int -- the vararg argument int ... arr should be the last one then.


If Stream API can be used, the task may be resolved conveniently in a declarative way:

public static int[] getTargetIndexes(int targetValue, int ... arr) {   
    return IntStream.range(0, arr.length) // get stream of indexes
            .filter(i -> arr[i] == targetValue) // keep only matching indexes
            .toArray(); // build output array
}

Upvotes: 0

GURU Shreyansh
GURU Shreyansh

Reputation: 909

If I understood your query correctly then you want an array with all the indices i such that arr[i]==targetValue. We can achieve this efficiently using any dynamic data structure. Like, use an ArrayList and keep adding all the desired indices one by one then convert the List to an array and return it.
Something like this:

List<Integer> index = new ArrayList<Integer>();
for (int i = 0; i < arr.length; i++)
{
    if (arr[i] == targetValue)
        index.add( i );
}
int[] maxValue = index.stream().mapToInt(Integer::intValue).toArray();
return maxValue;

Upvotes: 1

Related Questions