简体   繁体   中英

(Java) Search indexes of values of an array in another array

I have written the following code that takes two arrays and searches the index of the first occurrence of each value from the first array in the second one. For example if first = {15, 10, 18, 17, 15} and second = {10, 15, 10, 17} then the output would be an array with an equal length to first which contains the indices output = {1, 0, -1, 3, 1} , as eg 15 occurs in index 1 of the second array, 10 occurs at the 0th index, etc. The index will be -1 if the value in first doesn't occur in second . The code I've written to loop through the arrays is as follows:

public static int[] searchIndexes(int[] first, int[] second) {

    int[] indices = new int[first.length];
    int index = -1;

    for (int i = 0; i < first.length; i ++) {
        for (int j = 0; j < second.length; j ++) {
            if (first[i] == second[j])
                index = j;
        }
        indices[i] = index;
    }
    return indices;
}

However, for the given example the output is instead {1, 2, 2, 3, 1} . I think I do understand the issue; since 10 occurs twice in second then the index of the second occurrence is recorded, but I don't know how to get around this. Putting a break; statement after the if clause doesn't seem to fix it.

This would be straightforward by using the ArrayUtils.indexOf() utility method. Moving through the second array, call ArrayUtils.indexOf() for each of its elements in reference to the first array, storing the results in the indices array. This will also mean that there would be a single loop, not a nested loop.

The ArrayUtils class is a part of the org.apache.commons.lang3 library.

A different option, not requiring an external library, would be to convert your arrays to List s and then take advantage of the List.indexOf() method.

I hope that helps!

Two issues in your code:

  • Once index is set to any value at all, it can never again become -1
  • Once you find the first occurrence in the second array, you keep going - need a break .

Updated code:

  public static int[] searchIndexes(int[] first, int[] second) {
    int[] indices = new int[first.length];
    int index;

    for (int i = 0; i < first.length; i ++) {
      // reset index on each iteration
      index = -1;
      for (int j = 0; j < second.length; j ++) {
        if (first[i] == second[j]) {
          // once the first match is found, break out of the inner loop
          index = j;
          break;
        }
      }
      indices[i] = index;
    }
    return indices;
  }

try this

    public static int[] searchIndexes(int[] first, int[] second) {

        int[] indices = new int[first.length];
        //fill all values with -1
        Arrays.fill(indices,0,first.length - 1, -1);

        for (int i = 0; i < first.length; i++) {
            for (int j = 0; j < second.length; j++) {
                // when you met with same value fill your indices array with second array's value's index and break the loop
                if (first[i] == second[j]) {
                    indices[i] = j;
                    break;
                }
            }
        }
        return indices;
    }

Just add break after found the element and reset the index

public static int[] searchIndexes(int[] first, int[] second) {
        int[] indices = new int[first.length];
        int index = -1;

        for (int i = 0; i < first.length; i++) {
            index = -1;
            for (int j = 0; j < second.length; j++) {
                if (first[i] == second[j]) {
                    index = j;
                    break;
                }
            }
            indices[i] = index;
        }
        return indices;
    }

, main


    public static void main(String args[]) {
        int[] indices = searchIndexes(new int[] { 15, 10, 18, 17, 15 }, new int[] { 10, 15, 10, 17 });
        for (int i = 0; i < indices.length; i++)
            System.out.print(indices[i] + " ");
        System.out.println();
    }

, output

1 0 -1 3 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM