(Java) Искать индексы значений одного массива в другом массиве - PullRequest
0 голосов
/ 09 мая 2020

Я написал следующий код, который берет два массива и ищет индекс первого вхождения каждого значения из первого массива во втором. Например, если first = {15, 10, 18, 17, 15} и second = {10, 15, 10, 17}, то на выходе будет массив с длиной, равной first, который содержит индексы output = {1, 0, -1, 3, 1}, например, 15 встречается в индексе 1 массива second, 10 встречается в 0-й индекс, et c. Индекс будет -1, если значение из first не встречается в second. Код, который я написал для l oop через массивы, выглядит следующим образом:

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;
}

Однако для данного примера вместо этого выводится {1, 2, 2, 3, 1}. Я думаю, что понимаю проблему; так как 10 встречается дважды в second, то записывается индекс второго вхождения, но я не знаю, как это обойти. Размещение оператора break; после предложения if, похоже, не исправляет.

Ответы [ 4 ]

0 голосов
/ 09 мая 2020

Просто добавьте break после обнаружения элемента и сбросьте индекс

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;
    }

, основной


    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();
    }

, выведите

1 0 -1 3 1
0 голосов
/ 09 мая 2020

Две проблемы в вашем коде:

  • Если index вообще установлено на любое значение, оно больше никогда не станет -1
  • Как только вы найдете первое вхождение во втором массиве продолжайте - нужен break.

Обновленный код:

  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;
  }
0 голосов
/ 09 мая 2020

попробуйте это

    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;
    }
0 голосов
/ 09 мая 2020

Это было бы просто, используя служебный метод ArrayUtils.indexOf(). При перемещении по второму массиву вызовите ArrayUtils.indexOf() для каждого из его элементов по отношению к первому массиву, сохраняя результаты в массиве индексов. Это также будет означать, что будет один l oop, а не вложенный l oop.

Класс ArrayUtils является частью библиотеки org.apache.commons.lang3.

Другой вариант, не требующий внешней библиотеки, - это преобразовать ваши массивы в List s, а затем воспользуйтесь преимуществом метода List.indexOf().

Надеюсь, это поможет!

...