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

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

12.12.2017, 19:41. Показов 1364. Ответов 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 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru