JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N5.
terranum
28 уровень

Кухня(); Задание N5.

Статья из группы Архив info.javarush
участников
Кухня(); Задание N5. - 1 Правила [Одномерные массивы] Дана последовательность натуральных чисел a1, a2, ..., an. Создать массив из четных чисел этой последовательности. Если таких чисел нет, то вывести сообщение об этом факте.
Комментарии (12)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
timurnav
Уровень 21
7 октября 2015, 14:56
public static int[] method3(int[] array) {
        int[] tmp = new int[array.length];
        int count = 0;
        for (int n : array)
            if (n % 2 == 0)
                tmp[count++] = n;
        if (count != 0)
            return Arrays.copyOf(tmp, count);
        System.out.println("Четных чисел нет");
        return null;
    }
RabenokDmitry
Уровень 21
5 февраля 2015, 00:18
public static int[] findEvenNumbers(int[] array) {
        int[] result = new int[0];
        if (array.length == 0) {
            throw new IllegalArgumentException("Массив нулевой длины!");
        }
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 == 0 && array[i] > 0) {
                result = Arrays.copyOf(result, result.length + 1);
                result[result.length - 1] = array[i];
            }
        }
        if (result.length != 0) {
            return result;
        } else {
            throw new IllegalArgumentException("В массиве нет четных элементов");
        }

    }


На этом первую пятерку кухни я сегодня завершаю).
Kashey
Уровень 11
14 сентября 2014, 16:52
Попробовал решить тремя способами, и проверить скорость выполнения.
public static int[] getEvenArrayGrowUp(int[] array)
    {
        int[] evenArr = new int[0];
        int count = 0;
        for (int i = 0; i < array.length; i++)
        {
            if (array[i] % 2 == 0)
            {
                evenArr = Arrays.copyOf(evenArr, evenArr.length + 1);
                evenArr[count++] = array[i];
            }
        }
        if (evenArr.length == 0)
            throw new IllegalArgumentException("Natural digits not found");
        return evenArr;
    }

    public static int[] getEvenArrayArrayList(int[] array)
    {
        ArrayList<Integer> tempList = new ArrayList<Integer>();
        for (int i = 0; i < array.length; i++)
        {
            if (array[i] % 2 == 0)
            {
                tempList.add(array[i]);
            }
        }
        int[] evenArr = new int[tempList.size()];
        int count = 0;
        for (Integer I : tempList) evenArr[count++] = I;
        if (evenArr.length == 0)
            throw new IllegalArgumentException("Natural digits not found");
        return evenArr;
    }

    public static int[] getEvenArrayCountAndFor(int[] array)
    {
        int count = 0;
        for (int i = 0; i < array.length; i++)
        {
            if (array[i] % 2 == 0) count++;
        }
        int[] evenArr = new int[count];
        count = 0;
        for (int i = 0; i < array.length; i++)
        {
            if (array[i] % 2 == 0)
            {
                evenArr[count++] = array[i];
            }
        }
        if (evenArr.length == 0)
            throw new IllegalArgumentException("Natural digits not found");
        return evenArr;
     }

При размере массива в 10000, метод с растущим массивом выполняется за 26 мс! Метод с ArrayList — 2 мс, ну а самый простой
Docktor91
Уровень 40
22 августа 2014, 00:34
не густо))
public static Integer[] findNaturalEvenNumbers(Integer[] arr)
    {
        ArrayList<Integer>array=new ArrayList<>();
        Spliterator<Integer> si=Arrays.spliterator(arr);
        si.forEachRemaining(n-> {if (n%2==0&&n>0) array.add(n);});
        if(array.isEmpty())
            throw new IllegalArgumentException("Nothing found");
        return array.toArray(new Integer[array.size()]);
    }
Docktor91
Уровень 40
22 августа 2014, 01:16
public static ArrayList<Integer> findNaturalEvenNumbers2(ArrayList<Integer> arr)
    {
        ArrayList<Integer> res=new ArrayList<>();
        arr.stream().filter(n->n%2==0&&n>0).forEach(n->res.add(n));
        if(res.isEmpty())
            throw new IllegalArgumentException("Nothing found");
        return res;
    }
hubert
Уровень 41
21 августа 2014, 15:39
А на 8 джаве кто осилит?
Docktor91
Уровень 40
21 августа 2014, 14:38

public static int[] find (int[] arr)
    {
        if (arr.length==0)
            return null;
        int[] result = new int[0];
        for(int i = 0; i < arr.length; i++ )
        {
            if (arr[i]%2 == 0 && arr[i] > 0)
            {
                result = Arrays.copyOf(result, result.length + 1);
                result[result.length - 1] = arr[i];
            }
        }
        if (result.length==0)
            throw new IllegalArgumentException("Natural digits not found");
        return result;
    }
Sant9Iga
Уровень 41
21 августа 2014, 14:58
размер массива 0 это сильно
Docktor91
Уровень 40
21 августа 2014, 16:25
я не пойму, это сарказм или похвала?
terranum
Уровень 28
21 августа 2014, 19:08
if (arr.length==0)
            return null;

Я бы эти строки убирал, мы же мессаж передаем. Дали пустой массив, ну ок, наших там нет, лови Exception.
Как на счет натуральных чисел, я бы кидал IllegalArgument если бы в последовательности было бы хоть одно не отрицательное, мол вы же обещали массив натуральных получи фашист Exception! Или игнорить все.
В остальном, имя метода подправить, и все классно! Растущий массив, шикарен!
Docktor91
Уровень 40
21 августа 2014, 19:27
ну тут, из второго задания в основном(ничего нового я не придумал), править его не буду, т.к. хочу попробовать сделать как Хуберт сказал(сделал вызов))
я так понял имеются ввиду лямбда, и паралельные методы какието?
поверхностно прочитал… будем углубляться…
terranum
Уровень 28
21 августа 2014, 21:00
Давай, ждем восьмерку)