Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Критика решений задач на арифметику и сортировку

Привет! Читаю книгу, после каждой главы - задания.
Пользователь вводит числа через пробелы. Программа должна выводить:
Четные числа Нечетные числа Наибольшее число Наименьшее число Числа, которые делятся на 3 или на 9 (без остатка) Числа, которые делятся на 5 и на 7 (без остатка) Элементы, расположенные методом пузырька по убыванию модулей Трехзначные числа, в записи которых нет повторяющихся цифр Наибольший общий делитель Наименьшее общее кратное Простые числа Числа, отсортированные по возрастанию Числа, отсортированные по убыванию Числа в порядке убывания частоты встречаемости
Требуется критика кода. Представьте, что вы смотрите код на собеседовании.
public class Main { static Integer[] bubble; public static void main(String[] args) { //setup System.out.println("Введите числа через пробелы"); String[] arr = new Scanner(System.in).nextLine().split(" "); ArrayList ch = new ArrayList<>(); ArrayList unch = new ArrayList<>(); ArrayList ch39 = new ArrayList<>(); ArrayList ch57 = new ArrayList<>(); ArrayList z300 = new ArrayList<>(); ArrayList primes = new ArrayList<>(); bubble = new Integer[arr.length]; int min = Integer.parseInt(arr[0]); int lcm = Integer.parseInt(arr[0]); int max = Integer.parseInt(arr[0]); int nod = Integer.parseInt(arr[0]); //logic for (int x = 0; x < arr.length; x++) { String s = arr[x]; int i = Integer.parseInt(s); bubble[x] = i;
min = Math.min(min, i); max = Math.max(max, i); if (Math.abs(i % 2) == 0) ch.add(i); else unch.add(i); if (i % 3 == 0 || i % 9 == 0) ch39.add(i); if (i % 5 == 0 && i % 7 == 0) ch57.add(i); if (s.length() == 3) { String a = s.substring(0, 1); String b = s.substring(1, 2); String c = s.substring(2, 3); if (! a.equals(b) && ! b.equals(c) && ! c.equals(a)) { z300.add(i); } } nod = gcd(nod, i); lcm = lcm(lcm, i);
int b; int num;
for (b = min; b <= max; b++) { int counter = 0; for(num = b; num >= 1; num--) { if(b % num==0) { counter = counter + 1; } } if (counter == 2) { if(!primes.contains(b)) primes.add(b); } } } //unch System.out.print("
Нечетные : "); for (int unchitem : unch) System.out.print(unchitem + ", ");
//ch System.out.print("
Четные : "); for (int chitem : ch) System.out.print(chitem + ", ");
//ch39 System.out.print("
Делятся на 3 или 9 : "); for (int ch39item : ch39) System.out.print(ch39item + ", ");
//ch57 System.out.print("
Делятся на 5 и 7 : "); for (int ch57item : ch57) System.out.print(ch57item + ", ");
//z300 System.out.print("
Трехзначные числа без повторяющихся цифр : "); for (int z300item : z300) System.out.print(z300item + ", ");
sort(); System.out.print("
По возрастанию : "); for (int upitem : bubble) System.out.print(upitem + ", ");
unsort(); System.out.print("
По убыванию : "); for (int downitem : bubble) System.out.print(downitem + ", ");
bubbleSort(); System.out.print("
Пузырек : "); for (int bubbleitem : bubble) System.out.print(bubbleitem + ", ");
final ArrayList array = new ArrayList<>(Arrays.asList(bubble)); Collections.sort(array, new Comparator() { @Override public int compare(Integer lhs, Integer rhs) { int compareFreq = Collections.frequency(array, rhs) - Collections.frequency(array, lhs); return compareFreq != 0 ? compareFreq : rhs - lhs; } });
System.out.print("
Числа в порядке убывания встречаемости : "); for (int primesitem : array) System.out.print(primesitem + ", ");
System.out.print("
Простые числа : "); for (int primesitem : primes) System.out.print(primesitem + ", ");
//min & max & nod & nok System.out.println("
Минимальное число: " + min); System.out.println("Максимальное число: " + max); System.out.println("Наибольший общий делитель: " + nod); System.out.println("Наименьшее общее кратное: " + lcm); }
public static int gcd(int a, int b) { if (b == 0) return Math.abs(a); return gcd(b, a % b); }
public static int lcm(int a,int b){ return a / gcd(a,b) * b; }
public static void bubbleSort() { for (int i=bubble.length - 1;i > 0;i--) { for (int j = 0;j < i;j++) { if (Math.abs(bubble[j]) <= Math.abs(bubble[j + 1])) { int tmp=bubble[j]; bubble[j] = Math.abs(bubble[j + 1]); bubble[j + 1] = Math.abs(tmp); } } } }
public static void sort() { for (int i = bubble.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (bubble[j] >= bubble[j + 1]) { int tmp = bubble[j]; bubble[j] = bubble[j + 1]; bubble[j + 1] = tmp; } } } }
public static void unsort() { for (int i = bubble.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (bubble[j] < bubble[j + 1]) { int tmp=bubble[j]; bubble[j] = bubble[j + 1]; bubble[j + 1] = tmp; } } } }
UPD
Как мог упростил.
public class Main { public static ArrayList nums;
public static void main(String[] args) { System.out.println("Введите числа через пробелы"); String[] arr = new Scanner(System.in).nextLine().split(" "); nums = new ArrayList<>();
//перевод в Integer for (String str : arr) { nums.add(Integer.parseInt(str)); }
//создаем списки ArrayList ch, unch, ch39, ch57, z300, primes; ch = new ArrayList<>(); //для четных unch = new ArrayList<>(); //для нечетных ch39 = new ArrayList<>(); //для делимых на 3 или 9 ch57 = new ArrayList<>(); //для делимых на 5 и 7 z300 = new ArrayList<>(); //для трехзначных без повторений цифр primes = new ArrayList<>(); //для простых
int first = nums.get(0); int min = Collections.min(nums); int max = Collections.max(nums); int nod = first; int lcm = first;
for (Integer i : nums) { String s = "" + i; if (Math.abs(i % 2) == 0) ch.add(i); else unch.add(i); if (i % 3 == 0 || i % 9 == 0) ch39.add(i); if (i % 5 == 0 && i % 7 == 0) ch57.add(i); if (s.length() == 3) { String a = s.substring(0, 1); String b = s.substring(1, 2); String c = s.substring(2, 3); if (! a.equals(b) && ! b.equals(c) && ! c.equals(a)) { z300.add(i); } }
nod = nod(nod, i); lcm = nok(lcm, i);
for(int r =2; r <= i/2; r++) { if(i % r != 0) { primes.add(i); break; } } }
output("Четные", ch); output("Нечетные", unch); output("Делятся на 3 или 9", ch39); output("Делятся на 5 и 7", ch57); output("Трехзначные числа без повторяющихся цифр", z300); output("Простые числа", primes);
//сортируем по возрастанию sort(false); output("По убыванию", nums);
//переворачиваем список и получаем список по возрастанию Collections.reverse(nums); output("По возрастанию", nums);
//сортируем по частоте встречаемости Collections.sort(nums, new Comparator() { @Override public int compare(Integer lhs, Integer rhs) { int compareFreq = Collections.frequency(nums, rhs) - Collections.frequency(nums, lhs); return compareFreq != 0 ? compareFreq : rhs - lhs; } });
output("Числа в порядке убывания встречаемости", nums);
//сортируем по убыванию модулей sort(true); output("По убыванию модулей", nums);
System.out.println("
Минимальное число: " + min); System.out.println("Максимальное число: " + max); System.out.println("Наибольший общий делитель: " + nod); System.out.println("Наименьшее общее кратное: " + lcm); }
public static int nod(int a, int b) { if (b == 0) return Math.abs(a); return nod(b, a % b); }
public static int nok(int a, int b) { return a / nod(a, b) * b; }
public static void sort(boolean bubble) { if(bubble) { for(int b = 0; b < nums.size(); b++) nums.set(b, Math.abs(nums.get(b))); }
Collections.sort(nums, new Comparator() { @Override public int compare(Integer lhs, Integer rhs) { if(rhs > lhs) return 1; else if(rhs < lhs) return -1; else return 0; } }); }
public static void output(String text, List list){ System.out.print("
" + text + " : "); for (int i : list) System.out.print(i + ", "); }


Ответ

В принципе неплохо. Где-то на 4-ку.
Небольшие замечания:
Не выдерживается стиль операторов if/else/for в случаях когда в теле есть 1 оператор. Вы либо пишите их без скобок и с новой строки или со скобками. Хорошо бы таки сделать хоть какие-то классы, а не все пихать через static Метод output() надо сделать чтобы принимал PrintStream, тогда можно будет отправлять хоть куда, например в файл - но это уже придирки.
P.S. Collections.sort() - сортирует методом Quick Sort - условия задачи это разрешают?

Комментариев нет:

Отправить комментарий