Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875

Покритикуйте, пожалуйста

14.10.2019, 07:38. Показов 2421. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написала свой пермутатор. Мне нравится. Но понимаю, конечно, что найдется много разных косяков. Большая просьба к опытным программистам, если не лень, одним глазком взглянуть и потыкать меня носом в ошибки.

AlicesPermutator
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
71
72
73
74
75
76
77
import java.util.*;
 
public class AlicesPermutator<T> {
    private final HashSet<ArrayList<T>> all;
    private final List<T> source;
    private int index = 0;
 
    public AlicesPermutator(List<T> in) {
        this.source = in;
        this.all = permutation(in);
    }
 
    public AlicesPermutator(Set<T> in) {
        this.source = new ArrayList<>(in);
        this.all = permutation(source);
    }
 
    public AlicesPermutator(T[] in) {
        this.source = new ArrayList<>(Arrays.asList(in));
        this.all = permutation(source);
    }
 
    private HashSet<ArrayList<T>> permutation(List<T> alist) {
        ArrayList<ArrayList<T>> aal = new ArrayList<>();
        aal.add(new ArrayList<>());
        for (T s : alist) {
            aal = levelUp(aal, s);
        }
        return new HashSet<>(aal);
    }
 
    private ArrayList<ArrayList<T>> levelUp(ArrayList<ArrayList<T>> aalist, T up) {
        ArrayList<ArrayList<T>> res = new ArrayList<>();
        int index = 0;
        for (ArrayList<T> el : aalist) {
            for (int i = 0; i < aalist.get(0).size() + 1; i++) {
                res.add(new ArrayList<>());
                for (int j = 0; j < aalist.get(0).size(); j++) {
                    res.get(index).add(el.get(j));
                }
                res.get(index++).add(i, up);
            }
        }
        return res;
    }
 
    public HashSet<ArrayList<T>> getAll() {
        return all;
    }
 
    public T[] getNext() {
        ArrayList<ArrayList<T>> aal = new ArrayList<>(getAll());
        T[] res = (T[]) aal.get(index).toArray();
        index++;
        return res;
    }
 
    public boolean hasNext() {
        return index < getAll().size();
    }
 
    @Override
    public String toString() {
        return source + " -> permutations: " + getAll().size() + " -> " + getAll();
    }
 
    public String toColumnString() {
        ArrayList<ArrayList<T>> aal = new ArrayList<>(getAll());
        StringBuilder res = new StringBuilder("");
        for (ArrayList<T> ts : aal) {
            res.append(ts).append("\n");
        }
        res.append("***************************\n");
        res.append("number of permutations: ").append(getAll().size());
        return res.toString();
    }
}

Test
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
import java.util.*;
 
enum Words {
    XXX, YYY, ZZZ
}
 
public class Test {
    public static void main(String[] args){
        List<String> al = new ArrayList<>(Arrays.asList("АAA", "sss", "ВBB"));
        AlicesPermutator<String> pm1 = new AlicesPermutator<>(al);
        System.out.println(pm1.toString());
 
        Set<Integer> hs = new HashSet<>(Arrays.asList(435, 776, 102));
        AlicesPermutator<Integer> pm2 = new AlicesPermutator<>(hs);
        System.out.println(pm2.toString());
 
        Double[] ar = { 0.4, 0.7, 0.8 };
        AlicesPermutator<Double> pm3 = new AlicesPermutator<>(ar);
        System.out.println(pm3.toString());
 
        System.out.println();
        System.out.println(pm1.toColumnString());
 
        System.out.println();
        while (pm2.hasNext()) {
            System.out.println(Arrays.toString(pm2.getNext()));
            System.out.println(pm2.hasNext());
        }
    }
}

Результаты теста
Code
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
[АAA, sss, ВBB] -> permutations: 6 -> [[sss, АAA, ВBB], [ВBB, АAA, sss], [sss, ВBB, АAA], [АAA, ВBB, sss], [АAA, sss, ВBB], [ВBB, sss, АAA]]
[435, 102, 776] -> permutations: 6 -> [[102, 776, 435], [435, 102, 776], [776, 435, 102], [435, 776, 102], [102, 435, 776], [776, 102, 435]]
[0.4, 0.7, 0.8] -> permutations: 6 -> [[0.8, 0.7, 0.4], [0.4, 0.7, 0.8], [0.7, 0.8, 0.4], [0.7, 0.4, 0.8], [0.8, 0.4, 0.7], [0.4, 0.8, 0.7]]
 
[sss, АAA, ВBB]
[ВBB, АAA, sss]
[sss, ВBB, АAA]
[АAA, ВBB, sss]
[АAA, sss, ВBB]
[ВBB, sss, АAA]
***************************
number of permutations: 6
 
[102, 776, 435]
true
[435, 102, 776]
true
[776, 435, 102]
true
[435, 776, 102]
true
[102, 435, 776]
true
[776, 102, 435]
false


Есть три вопроса:
1. Как написать конструктор, чтобы принимал на входе enum?
2. Можно ли написать конструктор, принимающий на входе переменное число аргументов?
3. В 53 строке IDEA ругается на кастинг из Object[] в обобщенный массив. Это как-то лечится, или лучше оставить так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.10.2019, 07:38
Ответы с готовыми решениями:

Покритикуйте новичка
Доброго всем времени суток! Самоучкой пытаюсь освоить Java, общение с опытными программистами или преподавателями недоступно. Остаётся...

Покритикуйте код
Всем привет. У меня есть обычный POJO-класс с полями и класс для работы с данной коллекцией объектов. Посоветуйте плс, как улучшить...

Многопоточность. Покритикуйте
ищем простые числа на заданном промежутке, задавая кол-во потоков, равномерно деля работу между ними. потоки должны стартовать...

7
 Аватар для Thousbe
53 / 27 / 9
Регистрация: 04.05.2013
Сообщений: 83
14.10.2019, 10:36
Лучший ответ Сообщение было отмечено alicesmagic как решение

Решение

Переменную source можно сделать более общим типом
Java
1
private final Collection<T> source;
Что позволит схлопнуть первых два конструктора в один
Java
1
2
3
4
    public AlicesPermutator(Collection<T> in) {
        this.source = in;
        this.all = permutation(in);
    }
По второму вопросу
Java
1
2
3
4
    public AlicesPermutator(T ... in) {
        this.source = Arrays.asList(in);
        this.all = permutation(source);
    }
Третье, увы, не лечиться. Тут только можно вынести логику в отдельный класс, чтобы не мозолило глаза.

В методах permutation, levelUp, getAll, getNext и toColumnString можно изменить тип переменных, возвращаемых значений и параметров методов на более общий. Например,
Java
1
2
3
    public Set<List<T>> getAll() {
        return all;
    }
Незачем подчеркивать реализацию коллекций без необходимости. Особенно в методе getAll, так как данный метод публичный, столь строгая типизация может мешать внешним пользователям.

В методах getNext и toColumnString можно выкинуть данную строку и использовать результат вызова getAll напрямую, без копирования в памяти, так как aal далее не меняется.
Java
1
ArrayList<ArrayList<T>> aal = new ArrayList<>(getAll());
Логику работы методов getNext и hasNext стоит вынести в отдельный класс итератор.

Для тестов лучше использовать библиотеку JUnit, разнести тесты по разным методам и добавить проверку корректности работы класса.
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
14.10.2019, 12:25  [ТС]
Ого, сколько ценных замечаний! Спасибо большое, Thousbe, буду потихоньку доводить до ума свой "шедевр"
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.10.2019, 11:13
Лучший ответ Сообщение было отмечено alicesmagic как решение

Решение

alicesmagic, давайте пробежимся.

Ошибка №1 общеидеологическая, фундаментальная.
Вы строите и храните перестановки физически, вместо индексного построения. Соответственно у вас куча лишних по сути действий.

Ошибка №2 архитектурная, частично следует из №1.
Надо отметить, что вы почти подошли самостоятельно к ее исправлению.
Вы не смогли продумать и ответить четко на вопрос "а что должен делать класс?". В итоге он у вас и генерит вообще все перестановки, и выдает поочередно и форматирует в строку. Это плохо.
Хорошо то, что в процессе написания тестов, вы сделали getNext и hasNext. Но вы не довели мысль до конца и не пришли к выводу, что в таком случае ваш класс должен быть собственно итератором.
Чувствуете, как от этого все упрощается?

Ошибка №3 общее программирование.
Бизнес-логика в конструкторе -- плохо! У вас вообще по сути вся логика там.

Замечание №1 общее.
Код плохо читаем и ввиду отсутствия комментариев плохо понятен по сути.
Как то:
- что такое levelUp в контексте перестановок? Какой физический смысл?
- если метод getAll выдает все перестановки, то почему в виде HashSet<ArrayList<T>> когда одна перестановка выдается в виде T[]?

Для ознакомления гляньте, как сделано тут: Комбинаторика с использованием PermutationIterator
Там не идеально, но полезные вещи для себя думаю найдете.
3
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
16.10.2019, 12:49  [ТС]
HighPredator, спасибо! Попробую разобраться с этим. Вообще, я еще только начала изучать коллекции, и об итераторах имею самое поверхностное представление, но, думаю, ваш пример будет мне хорошим подспорьем.

levelUp - получая на входе список-полуфабрикат и очередной символ, поднимает список на следующий уровень. И так, пока не обработает все символы из исходного списка.

Вот по такой схеме: [] -> [A] -> [[А, В], [В, А]] -> [[А, В, C], [C, В, А], [В, C, А], [А, C, В], [В, А, C], [C, А, В]] и т.д.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.10.2019, 16:14
alicesmagic, не про levelUp я то разобрался. Мысль была в том, что вы ввели термин (уровень) и направление (вверх) формально не имеющие отношения собственно перестановкам как к кортежам из кобинаторики. Кстати, обратите внимание, вы когда стали мне объяснять, вы выбрали линейную схему и из нее ни уровень, ни направление верха не понятно. Как следствие у людей возникнет еще больше вопросов.
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
16.10.2019, 17:10  [ТС]
HighPredator, ну я с комбинаторикой дела не имела до сих пор и с ее терминологией совсем не знакома. Когда выбирала имя метода, то представляла себе level, как текущую длину вложенных списков, а up, как повышение этого уровня на единицу. Мне тогда показалось, что такое название хорошо отражает суть. Но, мало ли что мне кажется))
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
17.10.2019, 07:57
Цитата Сообщение от alicesmagic Посмотреть сообщение
я с комбинаторикой дела не имела до сих пор и с ее терминологией совсем не знакома
Понятно, тогда снимается. Ввиду этого: возьмите в таком случае за правило в подобных ситуациях, когда нужно что-то новое/незнакомое запрограммировать, прочитывать одну-две статьи (с той же википедии) по теме.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.10.2019, 07:57
Помогаю со студенческими работами здесь

Алгоритм: Трамвайные билеты. Покритикуйте
Привет, решение данной задачи на Java. Покритикуйте. package olympicexercises; import java.io.*; import java.util.*; import...

Задачи на числа. Решение. Покритикуйте. (часть №1)
Привет, решение данных заданий на Java - ниже. Покритикуйте. package chapt01.b; import java.util.*; import static...

Задачи на строки и числа. Решение. Покритикуйте
Задачи: Привет, решение данных заданий на Java - см. ссылку ниже. Покритикуйте. import java.io.InputStream; import...

Покритикуйте код моего сокет сервера для игрового чата
С помощью пары уроков, сделал сервер для визуального чата, типа галактики знакомств. Интересны советы по упрощению и оптимизации. Там...

Покритикуйте пожалуйста резюме Junior Java Developer
Пожалуйста скажите что стоит поправить. Если кому не сложно скиньте свои резюме с которыми вы устраивались. Резюме


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru