Java. Как из массива, состоящего из 100 чисел, убрать те, в которые входят числа 6 и 7?

Друзья, помогите, пожалуйста

Есть задача: создать массив из 100 чисел (от 1 до 100) и убрать из него все значения, в которые входят 6 и 7. Оставшийся массив вывести в консоль.

Массив я создал. А вот как из него теперь убрать все числа, в которые входят цифры 6 и 7 — понятия не имею. И что-то решения из интернета не могу всунуть в свой код...

package lesson8;

import java.util.Arrays;

public class homeWork8 {
    public static void main(String[] args) {
        int unluckyNumber1 = 6;
        int unluckyNumber2 = 7;

        int [] shuttleNumber = new int [100];
        for (int i = 0; i < shuttleNumber.length; i++){
            shuttleNumber [i] = i + 1;
        }  
        System.out.println(Arrays.toString(shuttleNumber));
    }
}

Ответы (4 шт):

Автор решения: c942o

Студенческое решение в лоб, правда на C#

  1. пройти по всему массиву, приводя каждое число к строке

  2. Искать 6 и 7 в строке, если нашли - пропускаем, иначе добавляем в массив

  3. Возвращаем массив обратно.

    public List<int> GetAllElementFromArrWithout6and7(int[] arr)
    {
        var list = new List<int>();
        for (int i = 0; i < arr.Length; i++)
        {
            var val = i.ToString();
            if (val.Contains("6") || val.Contains("7"))
            {
                continue;
            }
            list.Add(i);
        }
        return list;
    }
    
→ Ссылка
Автор решения: Vitaliy M.V.

Согласно условия задания, у вас массив определённой размерности, который после исключения чисел содержащих цифры 6 и 7 становится меньше. Для этого нужно создать два массива: Один длиной в 100 ячеек (согласно условия), а второй 100 минус количество вхождений с цифрами 6 и 7. Без использования коллекций в java, для массивов с фиксированной величиной, код выглядит следующим образом:

public class Main {
public static void main(String[] args) {
            
            int [] firstArray = new int [100];
            String tmp;
            int count=0;
            
            // Заполняем первый массив числами от 0 до 100
            for (int i=0; i < firstArray.length; i++){
                firstArray [i] = i;
                // Преобразовываем тип данных Integer в строку 
                // и проверяем последовательность значений char-ов в строке 
                tmp = Integer.toString(firstArray[i]);
                if (tmp.contains("6") || tmp.contains("7")) {
                // Считаем количество вхождений
                count++;
                }
            }
            // Создаём второй массив с длиной 100 минус "count" (количество вхождений) 
            // и перекладываем все числа которые нужны.
            int [] secondArray = new int [firstArray.length-count];
            for (int i=0, j=0; i < firstArray.length; i++){ 
                tmp = Integer.toString(firstArray[i]);
                if (tmp.contains("6") || tmp.contains("7")) {
                    i++;
                    }
                    else {
                        secondArray[j] = firstArray[i];
                        j++;
                    }
                }
            // Переопределяем первый массив и выводим содержимое 
            firstArray=secondArray;
            for (int a : firstArray) {
                System.out.println(a);
                }
            }
→ Ссылка
Автор решения: Upiter 1401

Длина массива не изменяется так что можно использовать коллекцию или создать новый массив и переписать значения в него исключая unluckyNumber1 и unluckyNumber2:

    int [] shuttleNumber = new int [100];
    int [] shuttleNumber1 = new int [98];
    for (int i = 0 , u = 0; i < shuttleNumber.length; i++){
          shuttleNumber [i] = i + 1;
          if (shuttleNumber [i] == unluckyNumber1 || shuttleNumber [i] == unluckyNumber2)
              continue;
          shuttleNumber1[u] = shuttleNumber[i];
          u++;
          }
System.out.println(Arrays.toString(shuttleNumber1));

           


→ Ссылка
Автор решения: Nowhere Man

Создавать первоначальный массив с числами от 1 до 100 необязательно, фактически это последовательность чисел, которую проще сгенерировать при помощи стримов, для чего со времён Java 8 и существует Stream API:

  • IntStream::range/rangeClosed, IntStream::iterate,
  • затем каждое число можно проверить на соответствие условиям при помощи операции IntStream::filter + IntStream::noneMatch,
  • и собрать результат в массив IntStream::toArray:
int[] without6and7 = IntStream.rangeClosed(1, 100)
        .filter(i -> IntStream.of(6, 7)
            .noneMatch(d -> d == i % 10 || d == i / 10)
        )
        .toArray();
System.out.println(Arrays.toString(without6and7));

[1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 50, 51, 52, 53, 54, 55, 58, 59, 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, 92, 93, 94, 95, 98, 99, 100]


Как было написано выше, количество элементов в результирующем массиве можно вычислить заранее -- вместо 100 элементов (10 * 10) за исключением двух цифр будет 8 * 8 = 64 элемента, соответственно, заполнять массив можно, инкрементируя индекс при заполнении очередного элемента.

Для нахождения цифр используются операции целочисленного деления / и остатка по модулю %

int[] arr = new int[64];

for (int i = 0, v = 1; v <= 100; v++) {
    int d1 = v % 10; // разряд единиц
    int d2 = v / 10; // разряд десятков
    if (d1 != 6 && d2 != 6 && d1 != 7 && d2 != 7) {
        arr[i++] = v;
    }
}
System.out.println(Arrays.toString(arr));
→ Ссылка