Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/75: Рейтинг темы: голосов - 75, средняя оценка - 4.85
 Аватар для Aviz__
2750 / 2058 / 508
Регистрация: 17.02.2014
Сообщений: 9,485

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

27.07.2018, 09:43. Показов 14891. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru