Почему программа работает медленно?

128
27 августа 2021, 07:30

Написал программу. Программа выполняет все поставленные задачи, кроме одной, она должна выполнятся за 1 секунду, но выполняется за 4, подскажите, пожалуйста, в чём причина:

import java.util.*;
public class Main {
    long startTime = System.currentTimeMillis();
    public static void main(String[] args) {
        Main main1 = new Main();
        System.out.println("Введите pin-код:");
        ArrayList list = main1.sort();
        for (int i=0;i<list.size();i++){
            System.out.print(list.get(i));
            if (i<list.size()-1) System.out.print(",");
        }
        System.out.println();
        main1.se();
    }
    public String input(){ //Ввод числа и проверка на соответствие условию
        Scanner scanner = new Scanner(System.in);
        String print = "123456789";
        char ch [] = {1,2,3,4,5,6,7,8,9};
        while (print.length()>8){
            print = scanner.nextLine();
            if (print.length()>8){
                System.out.println("Введите число длиной от 1 до 8 знаков:");
            }
        }
        return print;
    }
    public String [] mass(String number){ //Разбиение числа на составные части и занесение в массив
        int ch [] = new int[number.length()];
        for (int i = 0; i < number.length(); i++)
        {
            ch[i] = number.charAt(i) - '0';
        }
        String [] arrStr = new String[ch.length];
        for (int i=0; i<ch.length; i++){
            arrStr[i]=ch[i]+"";
        }
        return arrStr;
    }
    public String [] arrays(String a){ //Все возможные замены каждого числа
        if (a.equals(1+"")){
            String arr[] = {1+"",2+"",4+""};
            return arr;
        }
        else if (a.equals(2+"")){
            String arr[] = {2+"",1+"",5+"",3+""};
            return arr;
        }
        else if (a.equals(3+"")){
            String arr [] = {3+"",2+"",6+""};
            return arr;
        }
        else if (a.equals(4+"")){
            String arr [] = {4+"",1+"",5+"",7+""};
            return arr;
        }
        else if (a.equals(5+"")){
            String arr [] = {5+"",2+"",4+"",6+"",8+""};
            return arr;
        }
        else if (a.equals(6+"")){
            String arr [] = {6+"",3+"",5+"",9+""};
            return arr;
        }
        else if (a.equals(7+"")){
            String arr [] = {7+"",4+"",8+""};
            return arr;
        }
        else if (a.equals(8+"")){
            String arr [] = {8+"",7+"",5+"",9+"",0+""};
            return arr;
        }
        else if (a.equals(9+"")){
            String arr [] = {9+"",6+"",8+""};
            return arr;
        }
        else if (a.equals(0+"")){
            String arr [] = {0+"",8+""};
            return arr;
        }
        else {
            String arr [] = {0+"",8+""};
            return arr;
        }
    }
    public String [] merger (String [] arr, String [] arr2){
        String mass [] = new  String[arr.length*arr2.length];
        int b = 0;
        for (int i = 0; i<arr.length;i++){
            for (int j = 0; j<arr2.length;j++){
                mass[b]= arr[i]+arr2[j];
                b++;
            }
        }
        return mass;
    }
    public String [] combinations(String [] arr){ //Составление комбинаций чисел (возможных pin-кодов)
        String arrStr [] = new String[arr.length];
        for (int i=0; i<arrStr.length; i++){
            arrStr[i]=arr[i]+"";
        }
            String mass1 [] = arrays(arr[0]);
        if (arr.length>7){
            String [] line = merger(merger(merger(merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4])),arrays(arr[5])),arrays(arr[6])),arrays(arr[7]));
            return line;
        }
            else if (arr.length>6){
                String [] line = merger(merger(merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4])),arrays(arr[5])),arrays(arr[6]));
                return line;
            }
                else if (arr.length>5){
                    String [] line = merger(merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4])),arrays(arr[5]));
                    return line;
                }
                    else if (arr.length>4){
                        String [] line = merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4]));
                        return line;
                    }
                        else if (arr.length>3){
                            String [] line = merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3]));
                            return line;
                    }
                            else if (arrStr.length>2){
                                String [] line = merger(merger(mass1,arrays(arr[1])),arrays(arr[2]));
                                return line;
                        }
                                else if (arrStr.length>1) {
                                    String[] line = merger(mass1, arrays(arr[1]));
                                    return line;
                        }

        return mass1;
    }
    public ArrayList sort(){ //Сортировка массива комбинаций
        ArrayList list = new ArrayList();
        String [] mass = combinations(mass(input()));
        for (int i = 0; i<mass.length;i++){
            list.add(mass[i]);
        }
        Collections.sort(list);
        return list;
    }
    public void se(){
        long time = System.currentTimeMillis() - startTime;
        System.out.println(time);
    }
}
Answer 1

Вам слово рефакторинг знакомо? Программа работает медленно из-за создания огромного количества стринговых объектов. Немного подправил код, он сократился в 2,5 раза. Кроме того, убрал ненужные конкатинации, использовал джойнер для стрингов и паралельную сортировку. Теперь это работает в два раза быстрее, что, разумеется, не предел. Дальше уже своими силами) Удачи

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Main main1 = new Main();
        System.out.println("Введите pin-код:");
        String userInput = main1.input();
        long startTime = System.currentTimeMillis();
        List<String> list = main1.combinations(userInput);
        System.out.println(list);        
        System.out.println();
        long time = System.currentTimeMillis() - startTime;
        System.out.println(time);        
    }
    public String input() { //Ввод числа и проверка на соответствие условию
        final Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("Введите число длиной от 1 до 8 знаков:");
            String input = scanner.nextLine();
            try {Integer.valueOf(input);
            } catch (NumberFormatException e) {continue;}
            if (input.length()>8) continue;
            return input;
        }
    }
    private String[] arrays(String a) { //Все возможные замены каждого числа
        switch (a) {
            case "1": return new String[] {"1", "2", "4"};
            case "2": return new String[] {"2", "1", "5", "3"};
            case "3": return new String[] {"3", "2", "6"};
            case "4": return new String[] {"4", "1", "5", "7"};
            case "5": return new String[] {"5", "2", "4", "6", "8"};
            case "6": return new String[] {"6", "3", "5", "9"};
            case "7": return new String[] {"7", "4", "8"};
            case "8": return new String[] {"8", "7", "5", "9", "0"};
            case "9": return new String[] {"9", "6", "8"};
            case "0": return new String[] {"0", "8"};
            default: return new String[] {"0", "8"};
        } 
    }
    private String[] merger(final String[] arr, final String[] arr2) {
        final List<String> list = new ArrayList<>(arr.length*arr2.length);
        for (final String arr1 : arr) {            
            for (String arr21 : arr2) {
                list.add(String.join("", arr1,arr21));
            }
        }
        return list.toArray(new String[list.size()]);
    }
    public List<String> combinations(String userInput) { //Составление комбинаций чисел (возможных pin-кодов)
        String[] prev = null;
        for (String s : userInput.split("")) {
            String[] mass1 = arrays(s);
            if (prev == null) {
                prev = mass1;
                continue;
            }
            prev = merger(prev, mass1);
        }
        Arrays.parallelSort(prev);
        return Arrays.asList(prev);
    }
}
READ ALSO
Android, Refrofit. Как разобрать JSON с неизвестным ключом?

Android, Refrofit. Как разобрать JSON с неизвестным ключом?

У меня такой вопрос, как разобрать json с неизвестным ключом? https://acxio//api/v2/tickers

147
Что делает, означает аннотация @Stable?

Что делает, означает аннотация @Stable?

вот к примеру в классе String есть такое вот выражение

188
Азбука Морзе + Шифр Цезаря [дубликат]

Азбука Морзе + Шифр Цезаря [дубликат]

Всем добрый день! В общем не знаю, сможет ли кто помочь, так как вопрос сложный и объёмный, но все же отпишусьПошел я на курсы по java, знания базовой...

93
Преобразование Drawable

Преобразование Drawable

Начал свое знакомство с Realm и столкнулся с проблемой что такие классы как Calendar и Drawable не поддерживаются Realm, оно и логичноCalendar я стал хранить...

134