1

Тема: Допоможіть початківцю 2 задачі

1. Як із масиву вивести число, яке знаходиться посередині (1,4,6,7,3,8) => 6 ?
2. Як в масиві замінити числа, які повторюються на нуль (4,6,7,4,5,4,7)=> 4,6,7,0,5,0,0?

2 Востаннє редагувалося koala (22.10.2022 16:17:10)

Re: Допоможіть початківцю 2 задачі

UPD. Усе, як виявляється, не так уже й погано, але почитайте, як краще формулювати питання

Подякували: serghey111

3

Re: Допоможіть початківцю 2 задачі

1. Поділити довжину масиву на два і матимете ~середній елемент. Його вивести як звично.
2. Простий спосіб — пробігтися двома циклами, порівнюючи елементи. Складніший, який я використав би: ужити stream'ів.

Подякували: serghey111

4

Re: Допоможіть початківцю 2 задачі

Якщо поділити довжину масиву на 2 - виводить індекс елемента, а не значення

5

Re: Допоможіть початківцю 2 задачі

serghey11 написав:

Якщо поділити довжину масиву на 2 - виводить індекс елемента, а не значення

Саме так, виведіть елемент по індексу. Це просто.

6

Re: Допоможіть початківцю 2 задачі

Дякую, вийшло! Дійсно просто!

7

Re: Допоможіть початківцю 2 задачі

bebyk написав:

...Складніший, який я використав би: ужити stream'ів.

public static void main(String[] args){
        //якщо цифри 0-9
        int[] one = {4,6,7,4,5,4,7,1, 1, 1, 2, 4, 9};
        IntUnaryOperator mapper = new IntUnaryOperator(){
            boolean[] memory = new boolean[10];
            int j;
            @Override
            public int applyAsInt(int i){
                j = memory[i]? 0 : i;
                memory[i]=true;
                return j;
            };  
        };
        Arrays.stream(one).map(mapper).forEach(System.out::println);
        System.out.println("\n\n===========\n\n");
        //якщо цифри int, вмісто масиву використовуємо мапу
        int[] two = {12, 14, 13, 15, 14, 14, 34, 34, 36, 99, -34, -12, 0, -19999, -12, 13};
        Supplier<IntStream> stream = () -> Arrays.stream(two);
        Map<Integer,Boolean> memory = stream.get().distinct().boxed()
                .collect(Collectors.toMap(Function.identity(),v -> false));
        Function<Map<Integer,Boolean>,IntUnaryOperator> newMapper = 
                m -> i -> m.get(i)? 0 : m.put(i,true)? 0 : i;
        stream.get().map(i -> newMapper.apply(memory).applyAsInt(i)).forEach(System.out::println);
    }

Хотів зробити за одним проходом циклу, та на жаль в 2-му випадку не зміг.
Там трохи завеликий мапер вийшов, але щоб функція залишилась функцією (працювала з параметрами та не мала якихось побічних ефектів - довелось)