Сравнение двух массивов, а затем создание другого массива с общими элементами (без дубликатов) - PullRequest
0 голосов
/ 29 мая 2018

Привет, я новичок в Java, и я выполнял это лабораторное задание, где мы сравнивали элементы двух массивов, чтобы получить общие элементы.Я застрял на том, как избавиться от дубликатов.

Мой текущий код дает мне вывод [3, 0, 5, 6, 5, 0, 9, 0], и желаемым выходом общего является [3, 5, 6, 9, 0, 00, 0].

Кроме того, поскольку я не настолько опытен, просьба не публиковать профессиональные способы решения проблемы или «опытные» ответы на мой вопрос, поскольку это не помогло бы мне вообще: D.

Спасибо!

 public static void main (String[] args) {
    int[] a1 = {3, 8, 5, 6, 5, 8, 9, 2};
    int[] a2 = {5, 15, 4, 6, 7, 3, 9, 11, 9, 3, 12, 13, 14, 9, 5, 3, 13};
    int[] common = new int[a1.length];
    System.out.println("Exercise 3: ");
    findCommon(a1,a2,common);
 }



public static void findCommon(int[] a1, int[]a2, int[] common) {
    int num = 0;

      for (int i = 0; i < common.length; i++)
      {
          for (int j = 0; j < a2.length; j++)
          {
              if (a1[i] == a2[j]) // loops through every index of j, while keeping i at one index
                  num = a1[i];
                  for (int k = 0; k < common.length; k++) // makes sure there are no duplicates in common
                 {
                     if (num != common[k]) 
                      common[i] = num;
                 }
          }
      }

      for (int elements : common)
          System.out.print(elements + " ");
  }

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы очень близки к правильному ответу, но цикл for for (int k = 0; k < common.length; k++) выполняется для каждого элемента a2.Таким образом, когда значение существует для a1, но не существует для a2, вы помещаете старое значение num в общий массив.Если вы посмотрите на напечатанные элементы, вы увидите, что каждый раз, когда элемент просто существует в a1, элемент повторяется.Результат кода:

3 3 5 6 5 5 9 9

Вы поставили правильные отступы, но забыли фигурные скобки.Если вы поставите фигурные скобки в if (a1[i] == a2[j]), это будет результатом:

3 0 5 6 5 0 9 0

Но почему эти 0 есть?Потому что, когда вы создаете массив int в java, все элементы начинаются со значения 0. И вы помещаете общие элементы в одну и ту же позицию присутствия этих элементов в массиве a1.Вы можете исправить это, заполнив массив int недопустимым числом, и они проигнорируют его.В этом коде я предположил, что -1 является недопустимым значением.

public static void findCommon(int[] a1, int[] a2, int[] common) {
    int num = 0;
    for (int i = 0; i < common.length; i++) {
        common[i] = -1;
    }

    for (int i = 0; i < common.length; i++) {
        for (int j = 0; j < a2.length; j++) {
            if (a1[i] == a2[j]) { // loops through every index of j, while keeping i at one index
                num = a1[i];
                for (int k = 0; k < common.length; k++) // makes sure there are
                // no duplicates in common
                {
                    if (num != common[k])
                        common[i] = num;
                }
            }
        }
    }

    for (int elements : common) {
        if (elements != -1)
            System.out.print(elements + " ");
    }
}

Если вы видите, На if (elements != -1) я не поставил фигурные скобки, но это сработало.Если вы не поставите фигурные скобки, он просто выполнит следующую команду.

0 голосов
/ 29 мая 2018

Вы должны использовать Set s, чтобы делать подобные вещи, но так как это упражнение, я предоставил решение с некоторыми комментариями по пути в коде.

В основном вам следуетразбить проблему на кусочки, каждый из которых является собственным методом.Таким образом вам будет проще разобраться в этом.

  1. arrayIntersect(int[], int[])

    Задача этого метода - создать массив из двух массивов.Полученный массив должен иметь уникальные элементы, которые присутствуют в обоих массивах.

Вы можете сделать n.1 с помощью вспомогательного метода (упомянутого ниже).

inArray(int, int[])

Этот метод возвращает значение true, если массив содержит данный элемент, в противном случае - значение false.

Пример

public static void main (String[] args) {
    int[] a1 = {3, 8, 5, 6, 5, 8, 9, 2};
    int[] a2 = {5, 15, 4, 6, 7, 3, 9, 11, 9, 3, 12, 13, 14, 9, 5, 3, 13};

    int[] a3 = arrayIntersect(a1, a2);

    for (int a : a3) {
        System.out.println(a);
    }
}

private static int[] arrayIntersect(int[] a1, int[] a2) {
    int[] intersect = new int[Math.min(a1.length, a2.length)];

    int curIndex = 0;
    for (int x : a1) {
        if (inArray(x, a2) && !inArray(x, intersect)) {
            intersect[curIndex] = x;
            curIndex++;
        }
    }

    // resize intersect array to not include unused indexes
    int[] tmp = intersect;
    intersect = new int[curIndex];

    for (int i = 0; i < intersect.length; i++) {
        intersect[i] = tmp[i];
    }

    return intersect;
}

private static boolean inArray(int element, int[] array) {
    boolean result = false;

    for (int a : array) {
        if (element == a) {
            result = true;
            break;
        }
    }

    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...