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 шт):
Студенческое решение в лоб, правда на C#
пройти по всему массиву, приводя каждое число к строке
Искать 6 и 7 в строке, если нашли - пропускаем, иначе добавляем в массив
Возвращаем массив обратно.
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; }
Согласно условия задания, у вас массив определённой размерности, который после исключения чисел содержащих цифры 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);
}
}
Длина массива не изменяется так что можно использовать коллекцию или создать новый массив и переписать значения в него исключая 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));
Создавать первоначальный массив с числами от 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));