Аватар для Aviz__
2762 / 2069 / 510
Регистрация: 17.02.2014
Сообщений: 9,507

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

27.07.2018, 09:43. Показов 15026. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru