Аватар для Aviz__
2761 / 2068 / 509
Регистрация: 17.02.2014
Сообщений: 9,499

Получение всех комбинаций элементов массива

27.07.2018, 09:43. Показов 14957. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Время от времени возникает необходимость получить все комбинации элементов, какого либо набора.
Вот, пришло на ум, как относительно просто это сделать:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
        char [] strBox = {'a','b','c','d'};
        for (int i = 0; i < strBox.length; i++)
            for (int j = 0; j < strBox.length; j++) {
                if (j != i)
                    for (int k = 0;k < strBox.length; k++) {
                        if (k != i && k != j)
                            for (int l = 0; l < strBox.length; l++) {
                                if (l != i && l != j && l != k)
                                    System.out.printf("%s %s %s %s%n", strBox[i], strBox[j], strBox[k], strBox[l]);
                            }
                    }
            }
    }
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2018, 09:43
Ответы с готовыми решениями:

Генерация всех возможных комбинаций из элементов массива
Всем привет, совсем недавно зарегистрировался на форуме, начал потихоньку изучать Pascal ABC, поэтому прошу помочь мне с написанием кода. ...

Перебор всех комбинаций элементов массива в нескольких одномерных массивов
Всем привет! Парни, возникла задачка. Подскажите, как можно перебрать и вывести в текст контрол все возможные варианты комбинаций из трех...

Получение всевозможных комбинаций массива
необходимо получить всевозможные комбинации массива Исх. массив : 1,2,3 Комбинации : 1,2,3; 1,3,2; 2,1,3 и т.д.

30
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
30.07.2018, 18:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от WinniPuh Посмотреть сообщение
и пофиг на команду ретурн
Из 5 символов получить все комбинации длины 3. Какой будет вывод с return и какой и какой без?
Цитата Сообщение от WinniPuh Посмотреть сообщение
как программа поняла
Когда закончится for в первом(!) вызове make.
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
30.07.2018, 18:54
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Из 5 символов получить все комбинации длины 3. Какой будет вывод с return и какой и какой без?
Кликните здесь для просмотра всего текста
0
1
2
3
a b c
3
a b d
3
a b f
2
3
a c b
3
a c d
3
a c f
2
3
a d b
3
a d c
3
a d f
2
3
a f b
3
a f c
3
a f d
1
2
3
b a c
3
b a d
3
b a f
2
3
b c a
3
b c d
3
b c f
2
3
b d a
3
b d c
3
b d f
2
3
b f a
3
b f c
3
b f d
1
2
3
c a b
3
c a d
3
c a f
2
3
c b a
3
c b d
3
c b f
2
3
c d a
3
c d b
3
c d f
2
3
c f a
3
c f b
3
c f d
1
2
3
d a b
3
d a c
3
d a f
2
3
d b a
3
d b c
3
d b f
2
3
d c a
3
d c b
3
d c f
2
3
d f a
3
d f b
3
d f c
1
2
3
f a b
3
f a c
3
f a d
2
3
f b a
3
f b c
3
f b d
2
3
f c a
3
f c b
3
f c d
2
3
f d a
3
f d b
3
f d c

да ты угараешь надо мной????одинаково выводит что с ретурном что без

Цитата Сообщение от JIeIIIa Посмотреть сообщение
Когда закончится for в первом(!) вызове make.
цикл заканчивется и выходит из цикла потом заходит обратно в цикл и удаляет последний элемент
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
30.07.2018, 18:57
Цитата Сообщение от WinniPuh Посмотреть сообщение
да ты угараешь надо мной????
Троллинг детектид.

Тут уже указывал начальные данные и два вывода. Они одинаковые?

Добавлено через 48 секунд
Цитата Сообщение от WinniPuh Посмотреть сообщение
цикл заканчивется и выходит из цикла потом заходит обратно в цикл
Ага. Только заходит уже в "другом" make. Налицо не понимание рекурсии.
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
30.07.2018, 20:49
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Налицо не понимание рекурсии.
метод запустился заново, но первый запущенный продолжает работать?

Добавлено через 1 минуту
и когда конечный метод заканчивает работу метод продолжает там где остановился с момента где он запустил следующий и так далее? правильно?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
30.07.2018, 20:53
Цитата Сообщение от WinniPuh Посмотреть сообщение
с момента где он запустил следующий
Да, при этом вложенность запущеного метода (самого себя) может быть произвольной.
1
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
30.07.2018, 21:11
вот теперь понятно я то думал что рекурся тупо перезапескает метод
PS один фиг у меня что с ретурном что без ретурна одинаковый вывод по этому не понятно я чего он нужен
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
30.07.2018, 21:16
Цитата Сообщение от WinniPuh Посмотреть сообщение
один фиг
Запускать когда strBox.length > expectedSize. Разницу в выводе я уже показывал.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
30.07.2018, 23:56
JIeIIIa,
Метод конечно классно выглядит, мне понравился(но я не запускал), хотя я думаю что собеседника путает return, лучше бы другой for в else запихнуть.
Единственное непонятно это 3-й аргумент, expectedSize. Если он идентичный размеру массива то понятно - получаем все возможные комбинации. Вопрос, а если нет(неравен) то что он дает? Зачем нам это "волшебное число"?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
31.07.2018, 00:08
Цитата Сообщение от ViktorFX Посмотреть сообщение
лучше бы другой for в else запихнуть
Среди
Java
1
2
3
4
5
6
7
If(...) {
   foo();   
} else { 
   bar();
   bar();
   bar();
}
и
Java
1
2
3
4
5
6
7
If(...) {
   foo();   
   return;
}
bar();
bar();
bar();
мне второй вариант больше нравится. Else добавляет вложенность.

Цитата Сообщение от ViktorFX Посмотреть сообщение
Зачем нам это "волшебное число"?
Из набора в N букв (N = strBox.length составить все комбинации, длина которых равна expectedSize. Я приводил пример вывода для N == 4 и expectedSize == 3
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
10.08.2018, 08:52
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@Test
    public void cobo() {
        char[] strBox = {'a', 'b', 'c', 'd', 'f'};
        DatabeseCombo compbo = new DatabeseCombo(strBox);
        ArrayList<char[]> res = compbo.getRsl();
        res.forEach(el -> {
            for (int i = 0; i < el.length; i++) {
                System.out.print(el[i] + " ");
            }
            System.out.println("");
        });
    }
 
    @Test
    public void testic() {
        char[] strBox = {'a', 'b', 'c', 'd', 'f'};
        Deque<Integer> indexes = new LinkedList<>();
        Combo makeoneReturn = new Combo();
        makeoneReturn.makeOneReturn(strBox, indexes, 3);
        Combo makeoneNONO_Return = new Combo();
        makeoneNONO_Return.makeTwoNonReturn(strBox, indexes, 3);
        //тестируем разницы никакой
        assertThat(makeoneReturn.rsl, is(makeoneNONO_Return.rsl));
 
    }
 
    private static class Combo {
        private String rsl;
 
        public String getRsl() {
            return rsl;
        }
 
        //вот сделал два метода с ретурном и без
        private void makeOneReturn(char[] arr, Deque<Integer> indexes, int expectedSize) {
            if (indexes.size() == expectedSize) {
                for (Integer i : indexes) {
                    System.out.print(arr[i] + " ");
                    rsl = rsl + arr[i];
                }
                System.out.println();
                return;
            }
            for (int i = 0; i < arr.length; i++) {
                if (!indexes.contains(i)) {
                    indexes.addLast(i);
                    makeOneReturn(arr, indexes, expectedSize);
                    indexes.removeLast();
                }
            }
        }
        private void makeTwoNonReturn(char[] arr, Deque<Integer> indexes, int expectedSize) {
 
            if (indexes.size() == expectedSize) {
                for (Integer i : indexes) {
                    System.out.print(arr[i] + " ");
                    rsl = rsl + arr[i];
                }
                System.out.println();
            }
            for (int i = 0; i < arr.length; i++) {
                if (!indexes.contains(i)) {
                    indexes.addLast(i);
                    makeTwoNonReturn(arr, indexes, expectedSize);
                    indexes.removeLast();
                }
            }
        }
 
    }

ну не понимаю зачем ретурн...
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
10.08.2018, 09:58
WinniPuh, там, где есть return максимальная длина построенное последовательности равна expectedSize. Т.е. построит что необходимо, выведет на экран и рекурсивный спуск остановится (вернемся на шаг выше).
Там, где нет return максимальная длина построенной последовательности равна количеству символов в arr. При этом точно так же на экран будет выведен результат только тогда, когда выполняется условие indexes.size() == expectedSize. Но после вывода будет построена последовательность длины expectedSize+1, expectedSize+2 и т.д. Просто Вы этого на экране не увидите.
Например, поместите в конце обоих рекурсивных метовод System.out.println("+") и сравните выводы на экран.

Для размышления:
Java
1
2
3
4
5
for(int i=0; i<1000000; i++) {
  if ( i < 3 ) {
    System.out.println(i);
  }
}
и
Java
1
2
3
4
5
6
for(int i=0; i<1000000; i++) {
  System.out.println(i);
  if ( i == 3 ) {
    break;
  }
}
Данные два куска кода работают одинаково или же чем-то отличаются?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2018, 09:58
Помогаю со студенческими работами здесь

Выборка подмножества комбинаций без повторов из множества всех комбинаций перестановок
Собственно вопрос. Существует ли алгоритм нахождения без перебора уникальных комбинаций в сортированном множестве всех возможных...

Перебор всех возможных комбинаций из элементов двумерной матрицы
Собственно задача: Фирме нужно закупить n товаров. Каждый товар можно купить у одного из m продавцов. Необходим алгоритм, перебирающий...

Получение i-ого элемента массива без вычисления всех элементов (Ленивые вычисления)
Здравствуйте! Необходимо в цикле получать каждый i-й элемнент. Работаю с массивами массивов целых чисел, которые представляют всевозможные...

Найти произведение всех элементов массива и сумму всех нечетных элементов массива
Массив состоит из чисел от 1 до 200, кратных 13. a) Найти произведение всех элементов массива б) Найти сумму всех нечетных элементов...

Массивы: определение частного от деления суммы всех положительных элементов на количество всех отрицательных элементов массива
Составьте алгоритм определения частного от деления суммы всех положительных элементов на количество всех отрицательных элементов массива....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru