Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
apxibu119
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 57
1

Подскажите как оптимизировать

21.03.2017, 07:59. Просмотров 349. Ответов 8
Метки нет (Все метки)

всем привет. ребят, подскажите как можно переписать это в лучших традициях ООП и как можно оптимизировать данный код. понятно что все функции переделываем в приват-методы класса, кроме того который выдает результат в виде отсортированного списка в файле.
само условие задачи:
- Входной файл содержит: целые числа или строки. Каждая строка файла это новый элемент. Строки состоят из любых непробельных символов.

- Для чисел - в результате работы скрипта получаем новый файл отсортированный по возрастанию или убыванию.
- Для строк - в результате работы скрипта получаем новый файл, где строки отсортированны также по возрастанию или убыванию (по кодам символов).

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.*;
 
import static java.lang.Integer.parseInt;
import static jdk.nashorn.internal.objects.NativeString.trim;
 
public class fileSorting {
 
    private final static String INTTYPE = "-i";
    private final static String STRINGTYPE = "-s";
    private final static String SORTBYASC = "-a";
    private final static String SORTBYDESC = "-d";
 
    private static void mainSort(String inFile, String outFile, String dataType, String sortBy) throws FileNotFoundException {
 
        List<String> linesList = new ArrayList<>();
        try (Scanner scanner = new Scanner(new FileInputStream(inFile))) {
            while (scanner.hasNextLine()) {
                linesList.add(trim(scanner.nextLine()));
            }
        }
 
        if (dataType.equals(INTTYPE)) {
 
            if (sortBy.equals(SORTBYASC)) {
                int[] arrayInts = ascendingSortInt(linesList);
                try (PrintWriter writer = new PrintWriter(outFile)) {
                    for (int currentInt : arrayInts) {
                        writer.println(currentInt);
                    }
                }
 
            } else if (sortBy.equals(SORTBYDESC)) {
 
                int[] arrayInts = descendingSortInt(linesList);
                try (PrintWriter writer = new PrintWriter(outFile)) {
                    for (int currentInt : arrayInts) {
                        writer.println(currentInt);
                    }
                }
 
            } else {
                throw new IllegalArgumentException("Incorrect command format");
            }
 
        } else if (dataType.equals(STRINGTYPE) && sortBy.equals(SORTBYASC)) {
 
            String[] arrayWords = ascendingSortWords(linesList);
            try (PrintWriter writer = new PrintWriter(outFile)) {
                for (String currentWord : arrayWords) {
                    writer.println(currentWord);
                }
            }
 
        } else {
            throw new IllegalArgumentException("Incorrect command format");
        }
    }
 
    private static String[] ascendingSortWords(List<String> linesList) {
        String[] arrayWords = linesList.toArray(new String[linesList.size()]);
        for (int i = 1; i < arrayWords.length; i++) {
            String insertionElement = arrayWords[i];
            for (int j = 0; j < i; j++) {
                if (insertionElement.compareTo(arrayWords[j]) <= 0) {
                    System.arraycopy(arrayWords, j, arrayWords, j + 1, i - j);
                    arrayWords[j] = insertionElement;
                    break;
                }
            }
        }
        return arrayWords;
    }
 
    private static int[] ascendingSortInt(List<String> linesList) {
        int[] arrayInts = new int[linesList.size()];
        for (int i = 0; i < linesList.size(); i++) {
            try {
                arrayInts[i] = parseInt(linesList.get(i));
            } catch (Exception e) {
                throw new NumberFormatException("for this command need file with numbers");
            }
        }
 
        for (int i = 1; i < arrayInts.length; i++) {
            int insertionElement = arrayInts[i];
            for (int j = 0; j < i; j++) {
                if (insertionElement < arrayInts[j]) {
                    System.arraycopy(arrayInts, j, arrayInts, j + 1, i - j);
                    arrayInts[j] = insertionElement;
                    break;
                }
            }
        }
        return arrayInts;
    }
 
    private static int[] descendingSortInt(List<String> linesList) {
        int[] arrayInts = new int[linesList.size()];
        for (int i = 0; i < linesList.size(); i++) {
            try {
                arrayInts[i] = parseInt(linesList.get(i));
            } catch (Exception e) {
                throw new NumberFormatException("for this command need file with numbers");
            }
        }
 
        for (int i = 1; i < arrayInts.length; i++) {
            int insertionElement = arrayInts[i];
            for (int j = 0; j < i; j++) {
                if (insertionElement > arrayInts[j]) {
                    System.arraycopy(arrayInts, j, arrayInts, j + 1, i - j);
                    arrayInts[j] = insertionElement;
                    break;
                }
            }
        }
        return arrayInts;
    }
 
    public static void main(String[] args) throws FileNotFoundException {
 
        if (args.length == 4) {
            System.out.println("COMPLETED SORTING!!!");
            mainSort(args[0], args[1], args[2], args[3]);
        } else {
            throw new IllegalArgumentException("Incorrect command format");
        }
 
    }
}
запускаем через cmd в windows

закидываем java-файл в любую папку и туда же наш текстовик со списком
находясь в этой папке, зажимаем SHIFT и щелкаем правой кнопкой мыши
выбираем "открыть окно команд"

пишем javac fileSorting.java

затем пишем java fileSorting(расширение .class писать не нужно) и далее через пробел передаем два параметра

любой из этих вариантов
java fileSorting in.txt out.txt -i -a (для целых чисел по возрастанию)
java fileSorting in.txt out.txt -i -d (для целых чисел по убыванию)
java fileSorting in.txt out.txt -s -a (для строк по возрастанию)

вместо in.txt и out.txt можно задать любые имена файлов
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2017, 07:59
Ответы с готовыми решениями:

Подскажите начинающему как оптимизировать код
Требуется найти наибольшее из трёх чисел. Привожу код: package proga; import javax.swing.*;...

Посоветуйте, как оптимизировать код!
Программа переводит минуты в часы. import java.io.IOException; import...

Java. Нужен совет, как оптимизировать код
Здравстуйте! Опишу ситуацию(УТРИРОВАННО!). Я читаю данные из Xml файла. Данные представляют...

Подскажите как оптимизировать код
Собственно вот... void CalcValue(dynamic e) { var rez = e.GetType(); ...

javascrip: подскажите как оптимизировать
ситуация такова(начну издалека): у меня есть список товаров(вернее, меню ) каждому товару...

8
xoraxax
1962 / 1745 / 517
Регистрация: 05.07.2013
Сообщений: 8,466
Завершенные тесты: 2
21.03.2017, 12:04 2
как-то сложно
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
public static final Path SOURCE = Paths.get("D:/test.txt");
    public static final Path STRINGS = Paths.get("D:/strings.txt");
    public static final Path NUMBERS = Paths.get("D:/numbers.txt");
    public static final boolean IS_STRING = false;
    public static final boolean IS_NUMBER = true;
    public static final boolean IS_STRING_REVERSE = true;
    public static final boolean IS_NUMBER_REVERSE = true;
 
    public static void main(String[] args) throws InterruptedException {
        try (Stream<String> lines = Files.lines(SOURCE)) {
            Map<Boolean, List<String>> map = lines.collect(Collectors.groupingBy(StringUtils::isNumeric));
            map.put(IS_STRING, map.get(IS_STRING).stream().sorted(getStringComparator()).collect(Collectors.toList()));
            map.put(IS_NUMBER, map.get(IS_NUMBER).stream().map(line -> Long.parseLong(line)).sorted(getComparator()).map(l -> l.toString()).collect(Collectors.toList()));
            Files.write(STRINGS, map.get(IS_STRING));
            Files.write(NUMBERS, map.get(IS_NUMBER));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    private static Comparator<Long> getComparator() {
        return IS_NUMBER_REVERSE ? Comparator.reverseOrder() : Comparator.naturalOrder();
    }
 
    private static Comparator<String> getStringComparator() {
        return IS_STRING_REVERSE ? Comparator.reverseOrder() : Comparator.naturalOrder();
    }
1
apxibu119
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 57
21.03.2017, 17:17  [ТС] 3
оптимизировано)) но не ООП. ну и по задаче там все крутится вокруг того что запуск через cmd в windows
0
xoraxax
1962 / 1745 / 517
Регистрация: 05.07.2013
Сообщений: 8,466
Завершенные тесты: 2
21.03.2017, 17:28 4
Цитата Сообщение от apxibu119 Посмотреть сообщение
запуск через cmd в windows
для разбора параметров библиотеки есть
0
21.03.2017, 17:28
apxibu119
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 57
21.03.2017, 17:57  [ТС] 5
а если с учетом ООП и дальнейшей интеграцией класса в какое-нибудь приложение?
то все что в мейне делаем public-методом и все?
Цитата Сообщение от xoraxax Посмотреть сообщение
для разбора параметров библиотеки есть
типа таких - www.dokwork.ru/2012/09/parsing-command-line-arguments.html.html
0
xoraxax
1962 / 1745 / 517
Регистрация: 05.07.2013
Сообщений: 8,466
Завершенные тесты: 2
21.03.2017, 18:59 6
Ну если хочется попрактиковаться, напиши интерфейсы для получения данных, обработки данных, записи данных, предусмотри разные источники/приемники, напиши реализации для твоей задачи, как-нибудь это все обобщи для других типов данных. Предусмотри разные обработчики, соединение этих обработчиков в цепочки с разными путями. В общем много чего можно придумать.
А вообще городить миллион классов, для задачи, которая решается в пять строк немного оверхед.

Цитата Сообщение от apxibu119 Посмотреть сообщение
типа таких
commons cli, например
0
apxibu119
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 57
22.03.2017, 06:56  [ТС] 7
еще один момент. не могу понять откуда импорт - isNumeric
idea предлагает два импорта - оба пробовал. все равно не нравится ей.
0
Миниатюры
Подскажите как оптимизировать  
xoraxax
1962 / 1745 / 517
Регистрация: 05.07.2013
Сообщений: 8,466
Завершенные тесты: 2
22.03.2017, 08:16 8
Apache Commons вроде
0
apxibu119
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 57
22.03.2017, 14:24  [ТС] 9
Цитата Сообщение от xoraxax Посмотреть сообщение
Ну если хочется попрактиковаться, напиши интерфейсы для получения данных, обработки данных, записи данных, предусмотри разные источники/приемники, напиши реализации для твоей задачи, как-нибудь это все обобщи для других типов данных. Предусмотри разные обработчики, соединение этих обработчиков в цепочки с разными путями. В общем много чего можно придумать.
А вообще городить миллион классов, для задачи, которая решается в пять строк немного оверхед.
а если сделать так
- создать интерфейс для сортировки строк в файле с методами сортировки
- создать интерфейс для сортировки чисел в файле с методами сортировки

затем создаем класс, который имплементит данные интерфейсы
ну и там создаем в дополнение какой-то один метод, который в зависимости от того, что будет в файле применяет нужную сортировку
а?

Добавлено через 4 часа 39 минут
Цитата Сообщение от xoraxax Посмотреть сообщение
как-то сложно
блин я затупил) извиняюсь) самое главное-то не написал) сортировка должна быть методом вставки реализована)) поэтому код такой в старт посте) может там можно как-то сортировку упростить?
0
22.03.2017, 14:24
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2017, 14:24

подскажите, как оптимизировать код
Всем привет, js только начал изучать, но стоит вопрос..как не городить кучу кода, и оптимизировать...

Подскажите как оптимизировать программу
Задача: найти все вхождения строки T в строке S. #include &lt;stdio.h&gt; #include &lt;string.h&gt; ...

Подскажите как оптимизировать сайт
Падскажите как вам сайт и что в нём исправить ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.