С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 15

Написать программу для автоматической генерации методов

12.12.2017, 19:41. Показов 1348. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан текстовый файл, содержащий исходный код программы на языке Java. Написать
программу для автоматической генерации методов get, set, equals и hashcode для
заданного в командной строке класса или всех классов в входном файле. Вначале свой
работы программа должна осуществлять проверку существования этих методов, после чего,
в зависимости от настроек (которые указываются флагами командной строки),
либо заменяет существующие методы, либо нет.

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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package tester;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
 
 
/**
 * Created by shagi on 11.12.2014.
 */
public  class New {
    private static FileWriter fw;
 
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        System.out.println("Введите название файла:");
      //  String fileName = sc.nextLine();
        BufferedReader reader = new BufferedReader(new FileReader("q3.txt"));//fileName));
        System.out.print("Введите название класса:");
        String className="test";//sc.nextLine();
        ArrayList<String> text = new ArrayList<>();
 
        boolean isClassFound=false;
 
        while (reader.ready()) {
            String str=reader.readLine();
            if(str.contains("class "+className)){
                isClassFound=true;
            }
 
            if(isClassFound) {
 
                text.add(str);
            }
 
        }
        Map<String,String> fieldsMap;
        fieldsMap=findAllClassFields(text);
 
        reader.close();
        fw = new FileWriter("q1.txt");
    //    writeSetter(fieldsMap);
     //   writeGetter(fieldsMap);
        writeEquals(fieldsMap,className);
//        fw = new FileWriter(fileName);
//        for (String aText : text) {
//        }
        fw.close();
    }
 
 
 
    public static Map<String,String> findAllClassFields(ArrayList<String> text){
        Map<String,String> fieldsMap=new HashMap<>();
        boolean isClassEnded=false;
        int countOpen=0; //Количество  "{"
        int countClose=0;//Количество  "}"
        for (String str : text) {
            if (str.contains("{")) {
                countOpen++;
            } else if (str.contains("}")) {
                countClose++;
            }else if (countOpen-countClose==1 && isStringField(str)) {
                fieldsMap.put(getKeyAndValue(str,1),getKeyAndValue(str,0));
            }
 
 
            isClassEnded = countOpen==countClose;
            if (isClassEnded) return fieldsMap;
        }
        return null;
    }
 
    public static boolean isStringField(String str){
 
        //Если строка пустая - false
        if("".equals(str)) return false;
 
        //Если это комментарий - false
        char first=str.trim().charAt(0);
        if(first=='/' || first=='*'){
            return false;
        }
        return true;
    }
 
    public static String getKeyAndValue(String str,int a){
        String[] valueAndKey;
        if(str.contains("=")){
            String[] eq=str.split("=");
            valueAndKey=eq[0].split(" ");
        }else {
            valueAndKey=str.split(" ");
            int k=valueAndKey.length-1;
            String strqwe=valueAndKey[k];
            valueAndKey[k]=strqwe.substring(0,strqwe.length()-1);
        }
        if (a==1) return valueAndKey[valueAndKey.length-1];
        if (a==0) return valueAndKey[valueAndKey.length-2];
        return "";
    }
 
    public static void writeSetter(Map<String,String> fieldsMap)throws IOException{
        String out;
        for(Map.Entry<String,String> map:fieldsMap.entrySet()){
            out="\tpublic void "+"set"+map.getKey()+"("+map.getValue()+" "+map.getKey()+"){\n"+
            "\t\t"+"this."+map.getKey()+" = "+map.getKey()+";\n\t"+"}\n\n";
            fw.write(out);
        }
    }
 
    public static void writeGetter(Map<String,String> fieldsMap)throws IOException{
        String out;
        for(Map.Entry<String,String> map:fieldsMap.entrySet()){
            out="\tpublic "+map.getValue()+" get"+map.getKey()+"{\n"+
                    "\t\t"+"return "+map.getKey()+";\n\t"+"}\n\n";
            fw.write(out);
        }
    }
 
    public static void writeEquals(Map<String, String> fieldsMap, String className) throws IOException{
        fw.write("\t@Override\n"+
                  "\tpublic boolean equals(Object o) {\n"+
                  "\t\tif (this == o) return true;\n"+
                   "\t\tif (!(o instanceof "+className+")) return false;\n"+
                   "\n"+
                    "\t\t"+className+" "+className.toLowerCase()+" = ("+className+") o;\n"+
                    "\n");
        for(Map.Entry<String,String> map:fieldsMap.entrySet()){
            if(map.getValue().equals("int") || map.getValue().equals("byte") ||
                    map.getValue().equals("long") || map.getValue().equals("char")|| map.getValue().equals("boolean")){
                fw.write("\t\tif ("+map.getKey()+" != "+className+"."+map.getKey()+") return false;\n");
            }else if(map.getValue().equals("double")) {
                fw.write("\t\tif (Double.compare("+className+"."+map.getKey()+","+map.getKey()+") != 0) return false;\n");
            }else {
                fw.write("\t\tif (" + map.getKey() + " != null ? !" + map.getKey() + ".equals(" + className + "." + map.getKey() +
                        ") : " + className + "." + map.getKey() + " != null) return false;\n");
            }
        }
 
        fw.write("\t\treturn true;\n\t}");
    }
 
    public void writeHashCode(Map<String, String> fieldsMap) throws IOException{
        fw.write("\t@Override\n");
        fw.write("\tpublic int hashCode() {\n");
        fw.write("\t\t");
 
    }
 
    public static boolean ifTextContainsMethods(String str){
 
        return false;
    }
}
Добавлено через 20 секунд
вот мой вариант(еще не доделана), но мне почему-то кажется, что я пошел каким-то диким путем и есть ГОРАЗДО легче решение...

вкратце: находим все поля класса, и потом для каждого из них выводить геттеры сетеры equals.
а вот условие "Вначале свой работы программа должна осуществлять проверку существования этих методов" вообще
дикое. столько проверок делать надо

Добавлено через 26 секунд
Можете помочь доделать пожалуйста, очень надо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2017, 19:41
Ответы с готовыми решениями:

Подскажите как написать программу, которая переименовать все названия методов во всех проектах автоматически
Входные данные: 1) набор .java файлов с проектами 2) JAR файл со злополучной библиотекой версией 1.0. Выходные данные: набор .java файлов...

Метаданные для автоматической генерации базы данных
Необходимо создать пустую базу данных ,а затем &quot;вытащить&quot; метаданные для автоматической генерации базы данных Базу то я создал а вот с...

Написать программу для автоматической смены разрешения экрана
Всем привет. У меня такая проблема, что сейчас у компа стоит вместо монитора телек, который можно вроде как использовать как монитор. Но он...

3
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,761
12.12.2017, 21:18
Цитата Сообщение от Dan98 Посмотреть сообщение
условие "Вначале свой работы программа должна осуществлять проверку существования этих методов" вообще дикое
Почему дикое?

Цитата Сообщение от Dan98 Посмотреть сообщение
столько проверок делать надо
Всего-то (количество полей)*2 + 2. Причём геттеры и сеттеры проверяются в цикле, так что фактически четыре проверки.

Конечно, если вместо того, чтобы сделать нормальные структуры данных, описывающие класс, фигачить всё в Map<String, String>, то будет сложно, да.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
12.12.2017, 22:05
А если, допустим в классе есть анонимные классы или вложенные, их тоже форматить?
Или допустим к кажждому методу есть Javadoc, их оставлять?
0
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 15
15.12.2017, 20:38  [ТС]
Анонимные включаются в форматирование
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2017, 20:38
Помогаю со студенческими работами здесь

Можно ли написать программу для автоматической смены пароля почты, скайпа
Ребята, нужен ваш совет, можно ли написать программу (теоретически) для автоматической смены пароля? Для почты, скайпа, ICQ и т.д. ...

Для автоматической генерации элементов коллекций в классе надо определить статический метод
Есть 2 класса Person (базовый класс) и Student (наследуемый класс). Для автоматической генерации элементов коллекций в классе Test...

Написать консольную программу для генерации сигнатуры указанного файла (задействовать параллелизм)
Здравствуйте, дорогие форумчане. На днях подкинули заданице: Требуется написать консольную программу на C++ для генерации...

Написать программу для демонстрации всех методов класса
Описать класс по протоколу. Сохранить описание в отдельном модуле. Написать программу для демонстрации всех методов описанного класса. В...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru