печатать общие элементы из двух массивов int без повторения [новичок] - PullRequest
0 голосов
/ 06 ноября 2019

Буду признателен за несколько советов, чтобы я мог выбрать правильный путь. Я пытаюсь напечатать общие значения из двух массивов int без повторений. Я не могу использовать любые строки, коллекции, дополнительные массивы или манипулировать существующими массивами, и я могу использовать только пакет java.lang.

На данный момент это мой код:

int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8 };


for (int x : a) {

    for (int y : b) {

        if(x == y) {
             System.out.print(x + " ");
             break;
                   }
    }
}

или

   int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
   int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8};
   int al = a.length;
   int bl = b.length;

    for (int x = 0; x < al; x++) {

          for (int y = 0; y < bl; y++) {

            if ( a[x] == b[y] ) {

              System.out.print( a[x] + " ");
              break;
                                 }
          }
        }

-Что печатается с моим текущим кодом: 0 2 16 9 1 -8 9 9 3 0 1 -8 2
-Что я хочу напечатать (порядок может отличаться): 0 2 169 1 -8 3

У меня была идея проверить первый массив на наличие дубликатов, используя другой цикл for, и перейти к основному циклу (который проверяет общие элементы), только если он не является дубликатом, но яЯ не уверен, как это сделать или даже выполнимо. Все мои попытки реализовать эту идею пока терпят неудачу.

Я написал фрагмент кода с циклом for, который проверяет наличие дубликатов (но не уверен, что с ним делать):

  int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
  int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8};
  int al = a.length;
  int bl = b.length;


  for (int i = 0; i < al; i++) {

        for (int j = i+1; j < al ; j++) {

            // duplicates exist
            if (a[i] == a[j] ) {
            // not sure what to put here?
            }

        }
    }

У меня было несколько идей о том, как я могу решить эту проблему, но правилам задач удалось запретить все мои возможные решения, пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 06 ноября 2019
  1. Итерация с помощью
  2. Мы должны проверить, было ли такое число ранее отображаться в
  3. Если да, игнорировать его
  4. , если нет, мы должны проверить, выполняет лион существует в b
  5. , если есть, выведите его

Вот код. Я не проверял это. Но я думаю, что это должно работать. Общая идея ясна, я думаю.

  for (int i = 0; i < al; i++) {
        flagDubl = false;
        //!!here I've changed your code !!
        for (int j = 0; j < i ; j++) {
            // duplicates exist
            if (a[i] == a[j] ) {
                flagDubl = true;
                break;
            }
        }
        //ignore if it is dublicate
        if (!flagDubl) {
            for (int j = 0; j < bl; j++){
                if (a[i] == b[j]) {
                    //it is in both arrays;
                    System.out.print( a[i] + " ");
                    break;
                }

            }
        }
    }
0 голосов
/ 06 ноября 2019

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

В следующем примере:Я использовал TreeSet, потому что, помимо запрета повторяющихся записей, он упорядочивает значения, используя их метод compareTo:

public static void main(String[] args) {
    int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
    int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8 };

    // prepare a data structure to store the common values
    Set<Integer> commonValues = new TreeSet<>();

    // then compare each value of a to each value of b
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < b.length; j++) {
            // and if they are equal,
            if (a[i] == b[j]) {
                // store one of the values in the set
                commonValues.add(a[i]);
            }
        }
    }

    // then print all the values of the set
    System.out.println("Common values of a and b (no duplicates, ordered ascending) are:");
    commonValues.forEach(System.out::println);
}

. В результате получается следующее:

Common values of a and b (no duplicates, ordered ascending) are:
-8
0
1
2
3
9
16
0 голосов
/ 06 ноября 2019
  1. Итерация по первому массиву
  2. Проверить, встречался ли текущий элемент ранее в первом массиве
  3. Если нет: проверьте, присутствует ли элемент во втором массиве и, если это так, напечатайте его.

Это должно предотвратить любые повторяющиеся значения ввыход.

...